首页 > 解决方案 > 为什么我的应用启动后 WorkManager 会被触发多次?

问题描述

我有一个应用程序,我在其中声明了一个 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。

标签: androidkotlinbackgroundintervalsworker

解决方案


抱歉,我没有足够的声誉发表评论。

在您的测试中,您是否设置了 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"

推荐阅读