android WorkRequest выполняется в бесконечном цикле - PullRequest
0 голосов
/ 06 августа 2020

Моя задача, которую я хочу запустить, находится в doWork (). Эта часть приложения начинается с вызова scheduleUpdateJob(). Он, в свою очередь, выполняет doWork() через рабочий запрос, который выполняет операцию. В конце doWork() вызывается updateSchedule(), который устанавливает периодический запрос на выполнение doWork() каждые 15 минут. Моя проблема в том, что updateSchedule немедленно вызывает doWork, который вызывает свою вызывающую функцию в бесконечном l oop. Я что-то делаю не так?

public class EarthquakeUpdateWorker extends Worker {

    private static String PERIODIC_WORK_ID = "PERIODIC_WORK_ID";

    public EarthquakeUpdateWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    public static void scheduleUpdateJob(Context context) {
        WorkRequest workRequest = new OneTimeWorkRequest.Builder(EarthquakeUpdateWorker.class).setConstraints(Constraints.NONE).build();
        WorkManager workManager = WorkManager.getInstance();
        workManager.enqueue(workRequest);
  
    }

    @NonNull
    @Override
    public Result doWork() {
        // STUFF_TO_DO
        updateSchedule(getApplicationContext());
        return Result.success();
    }

    private static void updateSchedule(Context context) {
        Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.NOT_REQUIRED).build();
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        Boolean autoUpdate = sharedPreferences.getBoolean(PreferenceActivity.PREF_AUTO_UPDATE, true);
        int updateFreq = Integer.parseInt(sharedPreferences.getString(PreferenceActivity.PREF_UPDATE_FREQ, "60"));

        if(autoUpdate) {
            PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(EarthquakeUpdateWorker.class, updateFreq, TimeUnit.MINUTES).build();
            WorkManager workManager = WorkManager.getInstance();
            workManager.enqueue(workRequest);
           
        }
    }

}

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Не звоните updateSchedule() с вашего обратного вызова doWork(). Просто запланируйте его как периодi c рабочий запрос с самого начала, а не разовый, который затем переносится как периодi c после того, как он выполняется один раз.

В этом весь смысл periodi c рабочие запросы: они повторяются снова позже, автоматически, пока явно не отменены.

1 голос
/ 06 августа 2020

Установить начальная задержка при создании PeriodicWorkRequest

Заменить :

PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(EarthquakeUpdateWorker.class, updateFreq, TimeUnit.MINUTES).build();

С :

PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(EarthquakeUpdateWorker.class, updateFreq, TimeUnit.MINUTES).setInitialDelay(updateFreq, TimeUnit.MINUTES).build();
...