public void initialize() { taskDao.addListener( new ModelUpdateListener<Task>() { @Override public void onModelUpdated(final Task model) { if (Flags.checkAndClear(Flags.SUPPRESS_SYNC)) return; final ContentValues setValues = model.getSetValues(); if (setValues == null || !checkForToken() || setValues.containsKey(RemoteModel.REMOTE_ID_PROPERTY_NAME)) return; new Thread( new Runnable() { @Override public void run() { // sleep so metadata associated with task is saved AndroidUtilities.sleepDeep(1000L); pushTaskOnSave(model, setValues); } }) .start(); } }); updateDao.addListener( new ModelUpdateListener<Update>() { @Override public void onModelUpdated(final Update model) { if (Flags.checkAndClear(Flags.SUPPRESS_SYNC)) return; final ContentValues setValues = model.getSetValues(); if (setValues == null || !checkForToken() || model.getValue(Update.REMOTE_ID) > 0) return; new Thread( new Runnable() { @Override public void run() { pushUpdateOnSave(model, setValues); } }) .start(); } }); tagDataDao.addListener( new ModelUpdateListener<TagData>() { @Override public void onModelUpdated(final TagData model) { if (Flags.checkAndClear(Flags.SUPPRESS_SYNC)) return; final ContentValues setValues = model.getSetValues(); if (setValues == null || !checkForToken() || setValues.containsKey(RemoteModel.REMOTE_ID_PROPERTY_NAME)) return; new Thread( new Runnable() { @Override public void run() { pushTagDataOnSave(model, setValues); } }) .start(); } }); }