Как создать PeriodicWorkRequest с повторением logi c в java для Android WorkManager? - PullRequest
0 голосов
/ 09 мая 2020

Есть ли способ передать workInfo.getRunAttemptCount () из моей MainActivity классу, расширяющему Worker? Таким образом, я могу отслеживать количество повторных попыток и повторять их для 3 итераций и вызывать состояние RESULT.failure () внутри doWork () после 3 попыток, если запрос не был успешным.

Код:

    public Result doWork() {

        Integer retryAttemptCount = getInputData().getInt("retryAttempts",0);

        Log.e(TAG, "doWork: Work is done." + System.currentTimeMillis());


        if (retryAttemptCount > 3)
            return Result.failure();
        else
            return Result.retry();
    }

MainActivity

 private void setPeriodicWorkRequest(){

        Constraints constraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build();

        // Exponential retry with a min of 15 minutes during retry.
        PeriodicWorkRequest periodicWork = new
                PeriodicWorkRequest.Builder(MyPeriodicWork.class, 15, TimeUnit.MINUTES)
                .addTag("periodic_work")
                .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, PeriodicWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
                .setConstraints(constraints)
                .build();
        WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork("periodic_work", ExistingPeriodicWorkPolicy.KEEP, periodicWork);

        WorkManager.getInstance(getApplicationContext()).getWorkInfoByIdLiveData(periodicWork.getId())
                .observe(this, new Observer<WorkInfo>() {
                    @Override
                    public void onChanged(@Nullable WorkInfo workInfo) {
                        Data.Builder data = new Data.Builder();

                        if (workInfo != null && workInfo.getRunAttemptCount() > 0) {
                            // Passing params
                            data.putInt("retryAttempts", workInfo.getRunAttemptCount());

                        }else{
                            data.putInt("retryAttempts", 0);
                        }
                    }
                });
}

1 Ответ

0 голосов
/ 10 мая 2020

Вы можете позвонить по номеру getRunAttemptCount() прямо в своем классе Worker; это один из методов ListenableWorker:

public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
      // Do the work here--in this case, upload the images.
      Integer retryAttemptCount = getRunAttemptCount();

      try {

        uploadImages()
        return Result.success();

      } catch (Exception exception) {
        if (retryAttemptCount >= 3)
            return Result.failure();
        else
            return Result.retry();
        }
    }
}
...