如何在java中为Android WorkManager创建一个带有重试逻辑的PeriodicWorkRequest?

问题描述 投票:0回答:1

有什么办法可以将我的MainActivity中的workInfo.getRunAttemptCount()传递给Class extending Worker?这样我就可以跟踪重试次数并重复3次,如果请求没有成功,则在3次重试后在doWork()中调用RESULT.fail()状态。

我的代码是:

    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();
    }

主活动

 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);
                        }
                    }
                });
}
android-workmanager retry-logic
1个回答
0
投票

你可以调用 "RESULT.fail() "状态 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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.