in hydration app i have a class to schedule the job`and I planed to run my service after one minute but it doesn't work and there is an error in WaterReminderFirebaseJobService class that say that onstartjob() method must be called on main thread and i tried to create a class that extends from asynctask the error disappear but the job still not working how can i solve my problem?
jobservice class
import android.content.Context;
import android.os.AsyncTask;
import com.firebase.jobdispatcher.Job;
import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;
import com.firebase.jobdispatcher.RetryStrategy;
public class WaterReminderFirebaseJobService extends JobService {
private AsyncTask mBackgroundTask;
@Override
public boolean onStartJob(final JobParameters jobParameters) {
mBackgroundTask = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
return null;
}
@Override
protected void onPostExecute(Object o) {
jobFinished(jobParameters, false);
}
};
mBackgroundTask.execute();
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
if (mBackgroundTask != null) mBackgroundTask.cancel(true);
return true;
}
}
and ReminderUtilties
public class ReminderUtilties {
private static final int REMINDER_INTERVAL_MINUTES = 1;
private static final int REMINDER_INTERVAL_SECONDS = (int) (TimeUnit.MINUTES.toSeconds(REMINDER_INTERVAL_MINUTES));
private static final int SYNC_FLEXTIME_SECONDS = REMINDER_INTERVAL_SECONDS;
private static final String REMINDER_JOB_TAG = "hydration_reminder_tag";
private static boolean sInitialized;
synchronized public static void scheduleChargingReminder(@NonNull final Context context) {
if (sInitialized) return;
Driver driver = new GooglePlayDriver(context);
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
Job constraintReminderJob = dispatcher.newJobBuilder()
.setService(WaterReminderFirebaseJobService.class).setTag(REMINDER_JOB_TAG)
.setConstraints(Constraint.DEVICE_CHARGING).setLifetime(Lifetime.FOREVER).setRecurring(true)
.setTrigger(Trigger.executionWindow(
REMINDER_INTERVAL_SECONDS,
REMINDER_INTERVAL_SECONDS + SYNC_FLEXTIME_SECONDS)).setReplaceCurrent(true).build();
dispatcher.schedule(constraintReminderJob);
sInitialized = true;
}
}
this is main activity
public class MainActivity extends AppCompatActivity implements
SharedPreferences.OnSharedPreferenceChangeListener {
private TextView mWaterCountDisplay;
private TextView mChargingCountDisplay;
private ImageView mChargingImageView;
private Toast mToast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWaterCountDisplay = (TextView) findViewById(R.id.tv_water_count);
mChargingCountDisplay = (TextView) findViewById(R.id.tv_charging_reminder_count);
mChargingImageView = (ImageView) findViewById(R.id.iv_power_increment);
updateWaterCount();
updateChargingReminderCount();
ReminderUtilties.scheduleChargingReminder(this);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
}
private void updateWaterCount() {
int waterCount = PreferenceUtilities.getWaterCount(this);
mWaterCountDisplay.setText(waterCount+"");
}
private void updateChargingReminderCount() {
int chargingReminders = PreferenceUtilities.getChargingReminderCount(this);
String formattedChargingReminders = getResources().getQuantityString(
R.plurals.charge_notification_count, chargingReminders, chargingReminders);
mChargingCountDisplay.setText(formattedChargingReminders);
}
public void incrementWater(View view) {
if (mToast != null) mToast.cancel();
mToast = Toast.makeText(this, R.string.water_chug_toast, Toast.LENGTH_SHORT);
mToast.show();
Intent intent = new Intent(this, WaterReminderIntentService.class);
intent.setAction(ReminderTasks.ACTION_INCREMENT_WATER_COUNT);
startService(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
/** Cleanup the shared preference listener **/
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferenceUtilities.KEY_WATER_COUNT.equals(key)) {
updateWaterCount();
} else if (PreferenceUtilities.KEY_CHARGING_REMINDER_COUNT.equals(key)) {
updateChargingReminderCount();
}
}
public void textNotification(View view){
NotificationUtilties.remindUserBecauseCharging(this);
}
}
and ReminderTask class is
public class ReminderTasks {
public static final String ACTION_INCREMENT_WATER_COUNT="increment_water_count";
public static final String ACTION_DISMISS_NOTIFICATION = "dismiss_notification";
public static final String ACTION_CHARGING_REMINDER = "charging_reminder";
public static void executeTask(Context context,String action){
if(ACTION_INCREMENT_WATER_COUNT.equals(action)){
incrementWaterCount(context);
NotificationUtilties.clearAllNotification(context);
}else if (ACTION_DISMISS_NOTIFICATION.equals(action)){
NotificationUtilties.clearAllNotification(context);
}else if(ACTION_CHARGING_REMINDER.equals(action)){
PreferenceUtilities.incrementChargingReminderCount(context);
NotificationUtilties.remindUserBecauseCharging(context);
}
}
private static void incrementWaterCount(Context context){
PreferenceUtilities.incrementWaterCount(context);
}
}
and preferenceUtilties
public final class PreferenceUtilities {
public static final String KEY_WATER_COUNT = "water-count";
public static final String KEY_CHARGING_REMINDER_COUNT = "charging-reminder-count";
private static final int DEFAULT_COUNT = 0;
synchronized private static void setWaterCount(Context context, int glassesOfWater) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(KEY_WATER_COUNT, glassesOfWater);
editor.apply();
}
public static int getWaterCount(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int glassesOfWater = prefs.getInt(KEY_WATER_COUNT, DEFAULT_COUNT);
return glassesOfWater;
}
synchronized public static void incrementWaterCount(Context context) {
int waterCount = PreferenceUtilities.getWaterCount(context);
PreferenceUtilities.setWaterCount(context, ++waterCount);
}
synchronized public static void incrementChargingReminderCount(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int chargingReminders = prefs.getInt(KEY_CHARGING_REMINDER_COUNT, DEFAULT_COUNT);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(KEY_CHARGING_REMINDER_COUNT, ++chargingReminders);
editor.apply();
}
public static int getChargingReminderCount(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int chargingReminders = prefs.getInt(KEY_CHARGING_REMINDER_COUNT, DEFAULT_COUNT);
return chargingReminders;
}
}