Периодический рабочий запрос не выполняет doWork в Work Manager - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь периодически получать данные из удаленного URL, используя PeriodicWorkRequest в WorkManager. Я реализовал логику, проблема в том, что я не получаю никакого ответа от Worker.

Однако при первом запуске кажется, что он вызывает doWork(), но он не получает данные от сетевого вызова. Я удивлен, что когда я использую OneTimeWorkRequest, я получаю результат успеха от doWork(), а также от данных с сервера.

что я могу делать не так?

код ниже:

Рабочий класс

public class WorkerClass extends Worker {

private Context context;
public static final String EXTRA_WORKER_CLASS = "extra_tag";

public SpecialOffer(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
    this.context = context;
}

@NonNull
@Override
public Result doWork() {
    Log.d("WORKER_PERIOD", "started");
    String url = "https://sampleurl/get.php";
    //Volley synchronous call
    RequestFuture<String> future = RequestFuture.newFuture();
    StringRequest request = new StringRequest(url, future, future);
    MySingleton.getInstance(context).addToRequestQueue(request);

    try {
        String response = future.get();
        Data data = new Data.Builder()
                .putString(EXTRA_SPECIAL_CARS, response)
                .build();
        setOutputData(data);
        Log.d("WORKER_RESPONSE", response);
        return Result.SUCCESS;
    } catch (InterruptedException | ExecutionException e) {
        return Result.FAILURE;
    }
}
}

Метод вызова задачи

public void callTask(){
     PeriodicWorkRequest periodicRequest =
                new PeriodicWorkRequest.Builder(WorkerClass.class, 15, TimeUnit.MINUTES)
                        .setConstraints(constraints)
                        .addTag("SPECIAL_OFFER")
                        .build();

        workManager.enqueueUniquePeriodicWork("SPECIAL_OFFER",
                ExistingPeriodicWorkPolicy.KEEP, periodicRequest);

        workManager.getWorkInfoByIdLiveData(periodicRequest.getId())
                .observe(getActivity(), workInfo -> {
                    Log.d("WORKER_PERIOD", "observed");
                    // Do something with the status
                    if (workInfo != null && workInfo.getState().isFinished()) {
                        Log.d("WORKER_PERIOD", "observed");
                        String ava = workInfo.getOutputData().getString(SpecialOffer.EXTRA_SPECIAL_CARS);
                        if (ava.equals("available")) {
                            showSpecialOffer(true);
                        } else {
                            showSpecialOffer(true);
                        }
                    }
                });
}

1 Ответ

0 голосов
/ 15 июля 2019

Согласно документации PeriodicWorkRequest

Обычный жизненный цикл PeriodicWorkRequest - ЗАПРАВЛЕНО -> ВЫПОЛНЕНИЕ -> ПОЛУЧЕНО.По определению, периодическая работа не может завершиться в успешном или неудачном состоянии, так как она должна повториться.Он может завершиться только в случае явной отмены

Так что, когда вы делаете workInfo.getState().isFinished() в .observe, он всегда возвращает false, потому что .isFinished () документация метода говорит:

возвращает true для состояний SUCCEEDED, FAILED и * CANCELED

...