【问题标题】:Why is WorkManager fired multiple times as soon as my app starts?为什么我的应用启动后 WorkManager 会被触发多次?
【发布时间】:2019-11-10 13:41:47
【问题描述】:

我有一个应用程序,我在其中声明了一个 WorkManager,并且我的应用程序启动后,doWork() 覆盖的函数会被调用 3 或 4 次,而无需在代码中随时要求系统启动它。 ..

我已经检查过不会在应用程序中完成对 WorkManager 的引用。 App.kt 文件中只有一个(扩展 Application())。

在 App.kt 中:

class App : Application(){

companion object {
    var appSyncRepository = AppSyncRepository()
}
}

在 AppSyncRepository.kt 中:

class AppSyncRepository {
}

class AppSyncRepositoryWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
    return Result.success()
}
}

我希望工作人员不会被调用,因为我现在既没有声明任何 OneTimeWorkRequestBuilder 也没有声明任何 PeriodicWorkRequestBuilder。

【问题讨论】:

  • 您以前的应用中是否有任何PeriodicWorkRequest?即使您删除PeriodicWorkRequest 并重新安装您的应用程序,您已经排队的PeriodicWorkRequest 也不会被销毁,除非您取消它。您的所有定期工作都将在应用程序进程启动时调用。此外,似乎有多个相同作业的请求排队。使用enqueueUniquePeriodicWork 避免重复工作。
  • 不,我没有在 PeriodicWorkRequestBuilder 和 OneTimeWorkRequestBuilder 中添加任何代码。
  • 我认为 Sanlok Lee 是真实的,在分析了这个问题之后(几个月前),如果我没记错的话,你写的就是解释。

标签: android kotlin background intervals worker


【解决方案1】:

对不起,我没有足够的声誉来发表评论。

在您的测试中,您是否设置了 PeriodicWorkRequestBuilder 请求?如果是这样,您必须取消它。

作为第一步,我会检查一下安排了什么。

void cancelJob(){
    WorkManager.getInstance(mContext).cancelAllWorkByTag(SYNC_WORK_JOB1);
    WorkManager.getInstance(mContext).cancelAllWork();
    Log.d(TAG, "Job cancelled!");
}

private boolean isWorkScheduled() {
WorkManager instance = WorkManager.getInstance(mContext);
    ListenableFuture<List<WorkInfo>> statuses = instance.getWorkInfosByTag(SYNC_WORK_JOB1);
    try {
        boolean running = false;
        List<WorkInfo> 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 e) {
        e.printStackTrace();
        return false;
    } catch (InterruptedException e) {
        e.printStackTrace();
        return false;
    }
}

或者你可以在终端窗口中运行

adb shell dumpsys jobscheduler | grep -C 5 SyncWorkManagerService
adb shell dumpsys jobscheduler | grep -B 10 "Pending queue"

【讨论】:

  • 什么是SyncWorkManagerService
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多