【问题标题】:WorkManager's 15 minute PeriodicWorkRequest doesn't run for 6+ hours straightWorkManager 的 15 分钟 PeriodicWorkRequest 没有连续运行 6 个多小时
【发布时间】: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);

这就是RxWorkercreateWork()方法:

@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


    【解决方案1】:
    1. 按照here 的描述,尝试检查您的代码是否在打盹模式下运行

    Doze 中的维护窗口不会经常发生。第一个窗口出现在最后一次活动后一小时,下一个窗口出现在两个活动之后,下一个窗口出现在四个活动之后,依此类推。但这并不重要,因为用户甚至都没有移动她的设备。

    Some useful information

    1. 也许你还有其他选择:Schedule tasks with WorkManager

    【讨论】:

    • 是的,我已经知道它在打盹模式下不起作用。第三点有什么用?我已经在使用 WorkManager。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多