首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作经理的15分钟PeriodicWorkRequest没有连续运行6+小时

工作经理的15分钟PeriodicWorkRequest没有连续运行6+小时
EN

Stack Overflow用户
提问于 2020-09-04 16:12:56
回答 1查看 737关注 0票数 2

类似问题:Android工作经理计划中的工作人员在任务被杀后丢失

这里的答案表明,这是一个特定制造商的问题,但我使用的是Android One手机,它有未经修改的操作系统。

在大多数情况下,我的PeriodicWorkRequest按预期工作,但在一个直接的5-8小时窗口中,它根本不被执行。每当请求在日志文件中执行时,我都会进行日志记录,如下所示:

在图像中可见,红色框指示WorkManager没有运行请求的时间间隔。我可以保证,这个应用程序从安装以来从未被强制杀死。它被排除在最近的几次,但这似乎没有任何直接的影响。

我就是这样初始化请求的:

代码语言:javascript
复制
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);

这是createWork()RxWorker方法

代码语言:javascript
复制
@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());
                    }
                });
    });
}

根据这里的文件的理解,我的理解是,在打瞌睡模式下,还有一个窗口,允许所有请求执行,即使这些请求变得不那么频繁。那么,为什么会有超过6个小时的完全停电呢?,我需要获得电池优化权限才能正常工作吗?任何帮助都很感激!

EN

回答 1

Stack Overflow用户

发布于 2020-09-10 05:27:48

  1. 尝试检查在Doze模式下工作的代码,如这里所描述的

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

一些有用的信息

  1. 也许你还有别的选择:用WorkManager调度任务
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63744695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档