в приложении для гидратации у меня есть класс для планирования работы, и я планировал запустить свой сервис через одну минуту, но он не работает, и в классе WaterReminderFirebaseJobService есть ошибка, которая говорит, что метод onstartjob () должен быть вызван для основной поток, и я попытался создать класс, который простирается от asynctask, ошибка исчезает, но работа все еще не работает, как я могу решить мою проблему?
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;
}
}
и 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;
}
}
это основная деятельность
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);
}
}
, а класс ReminderTask равен
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);
}
}
и 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;
}
}