Android WorkManager:PeriodicWorkRequest未执行或已执行一次

ohtdti5x  于 2023-06-20  发布在  Android
关注(0)|答案(2)|浏览(215)

我正在使用workmanager为后台任务实现一个类。任务是周期性的,所以我使用PeriodicWorkRequest,但任务不执行或执行一次。上课了,怎么了?

  1. public class PollingWorker extends Worker {
  2. private final static String DELAY_KEY = "initialDelayDuration";
  3. private final static String TAG_POLLING_WORK_KEY = "background_polling_tag";
  4. private final static int DEFAULT_DELAY = 20000;
  5. public PollingWorker(
  6. @Nonnull Context ctx,
  7. @Nonnull WorkerParameters params) {
  8. super(ctx, params);
  9. }
  10. @NonNull
  11. @Override
  12. public Result doWork() {
  13. try{
  14. Log.d("TEST","sending work");
  15. return Result.success();
  16. }catch (Throwable throwable) {
  17. Log.e("TEST", "Error applying blur", throwable);
  18. return Result.failure();
  19. }
  20. }
  21. public static void startPollingWorker(
  22. @Nonnull Context context,
  23. final long interval,
  24. final String pollingWorkerTag
  25. ) {
  26. Log.d("TEST","interval:"+interval);
  27. Log.d("TEST","pollingWorkerTag:"+pollingWorkerTag);
  28. PeriodicWorkRequest pollingWorkerRequest =
  29. new PeriodicWorkRequest.Builder(PollingWorker.class,interval,TimeUnit.SECONDS)
  30. .addTag(pollingWorkerTag)
  31. .build();
  32. Operation operationResult=WorkManager.getInstance(context).enqueueUniquePeriodicWork(pollingWorkerTag,ExistingPeriodicWorkPolicy.KEEP,pollingWorkerRequest);
  33. Log.d("TEST","operation result:"+operationResult.getResult().isDone());
  34. Log.d("TEST","operation result:"+operationResult.getResult().isCancelled());
  35. }
  36. }

此日志包括:

suzh9iv8

suzh9iv81#

尝试更换工作经理,而不是保留现有的工作经理。

  1. private void setUpWorkManager() {
  2. WorkManager mWorkManager = WorkManager.getInstance(context);
  3. mWorkManager.cancelAllWorkByTag(BACKGROUND);
  4. PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(PeriodicWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
  5. .addTag(BACKGROUND)
  6. .build();
  7. mWorkManager.enqueueUniquePeriodicWork(BACKGROUND, ExistingPeriodicWorkPolicy.REPLACE, workRequest);
  8. }
bt1cpqcv

bt1cpqcv2#

期刊工作者没有成功或失败的状态。你的worker实际上正在运行,所以你的代码

  1. Log.d("TEST","operation result:"+operationResult.getResult().isDone());

永远不会成为现实
在日志中,您应该找到Worker result SUCCESS for Work,这意味着工作进程正在运行,但您无法通过operationResult.getResult().isDone()获得成功状态,因为定期工作进程的状态将被排队等待下一次。
您可以使用getWorkInfoByIdLiveData(workerId)观察工作。如下:

  1. WorkManager.getInstance(ctx).getWorkInfoByIdLiveData(workerId).observe(lifecycleScope, workInfo -> {
  2. Log.d("TEST", "worker listened state: " + workInfo.getState());
  3. });

使用UUID workerId = pollingWorkerRequest.getId();获取ID
然后你会发现你的工人的变化状态。跑步,询问

相关问题