java - 通过tag停止WorkManager并检查是否运行有问题

标签 java android android-workmanager

我已经阅读了几篇有关 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/

相关文章:

android - 使用 WorkManager 的定期日常工作请求

java - 小米和oppo等中国ROM上的工作管理器,在电池优化时,将工作的计划延迟增加几个小时

java - Arraylist 检查 CustomerID 是否在 Rent ArrayList 中

java - @initbinder 不适用于特定模型属性

java - 通过结合前瞻和后视,使用正则表达式在java中分割字符串

java - 如何在我的 Android 应用程序中离线时保存数据?

android - Workmanager 中唯一的 OneTimeWorkRequest

java - 翻译层的设计

android - 在 ListView 中使用 holder 作为 textview

android - android中ListView行的动态高度