android - WorkManager doWork 被解雇两次
问题描述
我的目标是每小时运行一次简单的任务。ExistingPeriodicWorkPolicy.KEEP
在应用程序启动时,我使用标志注册了一个独特的定期工作。
这是我的实现:
public class MyWorker extends Worker {
public MyWorker(Context context, WorkerParameters workerParams) {
super(context, workerParams);
// I don't do anyting with workerParams
}
public static void enqueueWork() {
Constraints constraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.build();
PeriodicWorkRequest request = new PeriodicWorkRequest
.Builder(MyWorker.class, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.addTag("MyWorkerWork")
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("MyWorkerWork",
ExistingPeriodicWorkPolicy.KEEP, request);
}
@NonNull
@Override
public Result doWork() {
Log.i(TAG, "doWork");
return Result.success();
}
}
我唯一打电话的地方enqueueWork()
是Application#onCreate
。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MyWorker.enqueueWork();
}
}
上面的设置运行有点好。其中一个问题是有时会doWork
连续调用两次,中间有大约 30 秒的时间。这不是 100% 可重现的,但是当我将手机放下过夜并第二天回来并第一次打开手机显示屏时,我经常会看到这种情况。
典型的日志如下所示:
01-13 13:29:04.601 19018 19449 I/MyApp: doWork
01-13 13:29:04.700 19018 19124 I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=37064d6c-297b-4c0d-9fd7-xxxxxxxxxxxx, tags={ com.xxx.MyWorker, MyWorkerWork } ]
01-13 13:29:42.203 19018 19482 I/MyApp: doWork
01-13 13:29:42.292 19018 19145 I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=37064d6c-297b-4c0d-9fd7-xxxxxxxxxxxx, tags={ com.xxx.MyWorker, MyWorkerWork } ]
有趣的是,这发生在没有进程被杀死的情况下。如果您以前遇到过这种情况,请提供帮助。
解决方案
推荐阅读
- java - Java - 你想继续吗?(Y/N)
- android - 如何在 2 个不同的班级之间等待接收结果:
- spring - 替换 Spring Bean 的私有方法
- node.js - 连接到 SMTP 服务器
- php - 如何在 ubuntu 18.04 和 PHP 7.2 上将 Libzip 更新到 1.2
- javascript - 如何在Javascript中的多维数组中获取每个标题的最小数字
- javascript - 如何在带有条件标记渲染的传单地图中访问嵌套的 json 对象并显示标记
- android - 为什么小吃店会消失在屏幕上?
- javascript - 从 Firebase 存储和检索数据以不同的格式返回
- angular - 角度如何在组件的模板中呈现html标记