android - 为什么我的应用启动后 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。
解决方案
抱歉,我没有足够的声誉发表评论。
在您的测试中,您是否设置了 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"
推荐阅读
- python - 避免在 broken_barh 中出现重复的图例
- android - Android 深度链接 Intent 问题
- jdbc - 为什么我不能为 oracle 12c 创建 jndi 数据源?
- java - 如何通过 JPQL 从 SQL 计数返回布尔结果
- html - 在非全宽元素中设置全宽动态元素样式的最佳方法是什么?
- dart - Flutter:无法使用任何包获取位置 - 尝试了各种包 - getLocation 块
- php - 如何在 PHP 中使用存储在数据库中 SQL 查询中的变量
- deep-learning - RNN 如何从图像中提取特征
- android - React Native:悬停图像 onPress
- javascript - getorgchart - 我想动态分配颜色