我已经阅读了几篇有关 WorkManager 在 Android 中如何工作的文章,但仍然遇到问题。
这是我的实现:
implementation "androidx.work:work-runtime:2.2.0"
这是我的代码:
public class NotificationWorker extends Worker {
private static final String WORKER_TAG =
NotificationWorker.class.getSimpleName();
public static void start(Context context){
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest notificationWorker =
new PeriodicWorkRequest.Builder(
NotificationWorker.class,
30,
TimeUnit.MINUTES,
15,
TimeUnit.MINUTES
).setConstraints(constraints)
.addTag(NotificationWorker.WORKER_TAG)
.build();
WorkManager.getInstance(context)
.enqueueUniquePeriodicWork(
NotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP,
notificationWorker
);
}
public static void stop(Context context) {
// THIS NOT STOP WORKER !
WorkManager.getInstance(context)
.cancelAllWorkByTag(NotificationWorker.WORKER_TAG);
// THIS WORKS BUT STOP ALL WORKERS
// WorkManager.getInstance(context).cancelAllWork();
}
public static boolean isScheduled(Context context) {
// NOT WORKS!
WorkManager instance = WorkManager.getInstance(context);
ListenableFuture<List<WorkInfo>> statuses = instance
.getWorkInfosByTag(NotificationWorker.WORKER_TAG);
try {
boolean running = false;
List<WorkInfo> workInfoList;
workInfoList = statuses.get();
for (WorkInfo workInfo : workInfoList) {
WorkInfo.State state = workInfo.getState();
running = state == WorkInfo.State.RUNNING |
state == WorkInfo.State.ENQUEUED;
}
return running;
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
return false;
}
}
public NotificationWorker(
@NonNull Context context,
@NonNull WorkerParameters workerParams
) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
// ...
}
}
WorkerManager 启动并正常工作。
第一个问题是我无法使用cancelAllWorkByTag停止它 但只能使用cancelAllWork。在我的场景中,我只使用一个 Workmanager 所以这不会是一个大问题,但是我想了解这个错误。
第二个问题是如何知道WorkeManager是否正在运行? “isScheduled”函数始终返回 false。 我已经读到,随着不同的实现,某些东西已经发生了变化,但我不知道如何更新代码。
感谢您的提示。
最佳答案
我不知道这是否只是一个拼写错误,但您的“正在运行”变量在此处的 isScheduled(Context context)
方法上设置错误。
for (WorkInfo workInfo : workInfoList) {
WorkInfo.State state = workInfo.getState();
running = (state == WorkInfo.State.RUNNING ||
state == WorkInfo.State.ENQUEUED);
}
您使用的是 one | 而不是 two,这意味着您需要使用 ||
而不是 |
在做检查的时候。您发送的代码中的变量可能被错误地分配。
要尝试回答您的第一个问题:您可以尝试使用以下代码来停止工作线程:
manager.cancelUniqueWork(NotificationWorker.WORKER_TAG);
这背后的原因是您在将其入队时向工作人员发送 ID,而不是标签。 “NotificationWorker.WORKER_TAG”不是标签,而是您使用时的 ID:
WorkManager.getInstance(context)
.enqueueUniquePeriodicWork(
NotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP,
notificationWorker
);
编辑:我刚刚意识到您还调用了错误的方法来获取您添加的工作人员。标签可能不会添加,但 ID 肯定会添加。因此,不要使用 manager.getWorkInfosByTag(NotificationWorker.WORKER_TAG)
,而是使用 manager.getWorkInfosForUniqueWork(NotificationWorker.WORKER_TAG)
来查看您是否可以实际获取安排的工作。
关于java - 通过tag停止WorkManager并检查是否运行有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57865090/