为什么 WorkManager 在我的应用程序启动后会被多次触发?
Why is WorkManager fired multiple times as soon as my app starts?
我有一个应用程序,我在其中声明了一个 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。
抱歉,我没有足够的声誉来发表评论。
在您的测试中,您是否设置了 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;
}
}
或者您可以 运行 在终端 window
adb shell dumpsys jobscheduler | grep -C 5 SyncWorkManagerService
adb shell dumpsys jobscheduler | grep -B 10 "Pending queue"
我有一个应用程序,我在其中声明了一个 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。
抱歉,我没有足够的声誉来发表评论。
在您的测试中,您是否设置了 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;
}
}
或者您可以 运行 在终端 window
adb shell dumpsys jobscheduler | grep -C 5 SyncWorkManagerService
adb shell dumpsys jobscheduler | grep -B 10 "Pending queue"