【发布时间】:2020-09-04 16:12:56
【问题描述】:
类似问题:Android workmanager scheduled worker lost after task killed
这里的答案表明这是特定制造商的问题,但我使用的是具有未修改操作系统的 Android One 手机。
在大多数情况下,我的PeriodicWorkRequest 按预期工作,但是在连续 5-8 小时的窗口中,它根本没有被执行。每当请求在日志文件中执行时,我都会记录下来,这就是它的外观:
如图所示,红色框表示 WorkManager 未运行请求的时间间隔。我可以保证该应用程序自安装以来从未被强制终止。它最近几次被清除,但这似乎没有任何直接影响。
这是我初始化请求的方式:
PeriodicWorkRequest checkLastSeenRequest =
new PeriodicWorkRequest.Builder(LastSeenWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS,
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS, TimeUnit.MILLISECONDS)
.setBackoffCriteria(
BackoffPolicy.LINEAR,
PeriodicWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"checkLastSeen",
ExistingPeriodicWorkPolicy.KEEP,
checkLastSeenRequest);
这就是RxWorker的createWork()方法:
@NonNull
@Override
public Single<Result> createWork() {
return Single.create(subscriber -> {
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.collection("users").document("doc").get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
DocumentSnapshot doc = task.getResult();
if (doc != null && doc.exists() && doc.getData() != null
&& doc.getData().get("lastSeen") != null) {
--> // this is where I log
subscriber.onSuccess(Result.success());
} else {
--> XLog.e("No document found to read from");
subscriber.onError(new Error("Document not found"));
}
} else {
--> XLog.e(task.getException());
subscriber.onError(task.getException());
}
});
});
}
从documentation here 我的理解是,在打盹模式下,即使这些请求变得不那么频繁,也有一个允许执行所有请求的窗口。那么为什么超过 6 小时会完全停电?我是否需要获得电池优化权限才能使其按预期工作?任何帮助表示赞赏!
【问题讨论】:
标签: android android-workmanager