为什么我的应用程序启动后,WorkManager会多次触发?

时间:2019-06-28 15:30:01

标签: android kotlin background intervals worker

我有一个应用程序,其中已声明一个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()
}
}

我希望不会调用该worker,因为我现在尚未声明任何OneTimeWorkRequestBuilder或任何PeriodicWorkRequestBuilder。

1 个答案:

答案 0 :(得分: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"