首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WorkManager一次多次执行enqueueUniquePeriodicWork()吗?

WorkManager一次多次执行enqueueUniquePeriodicWork()吗?
EN

Stack Overflow用户
提问于 2019-06-20 20:39:42
回答 3查看 881关注 0票数 5

我是个新手,所以如果这个问题措辞不好,请让我知道!我有一个Android应用程序,即使手机处于锁定状态,它也需要大约每15分钟执行一次任务。上下文是:- Im以SDK23或更高版本为目标-任务1)获取用户的位置2)使用OKHttpClient调用HTTPS API,然后3)将结果发送到Firestore数据库

我正在使用WorkManager来尝试实现这个目标。然而,问题是它每次执行时,它都会执行8-9次,并且它的时间非常不规则。我可以从Firestore条目和Logcat中看到这一点。

WorkManager真的是这项任务的正确方式吗?我正在使用

代码语言:javascript
运行
复制
implementation "androidx.work:work-runtime:2.0.1"
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.ExistingPeriodicWorkPolicy;

我发现其他人也遇到过这个问题:Android Worker execute the job multiple times

代码语言:javascript
运行
复制
//In MainActivity.java: 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(
                PeriodicReadings.class, 15, TimeUnit.MINUTES).build();

        WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);

//In PeriodicReadings.java:

    @NonNull
    @Override
    public Result doWork() {
        getReadings(); //work to be done 
        return Result.success();
    }

我预计每15分钟就会有一个读数出现在Firestore数据库中,但我看到的是8-9个读数以不规则的时间间隔出现,每15分钟-2小时变化一次。

我已经尝试了清理和重建,使缓存失效并重新启动缓存,以及在手机上重新加载应用程序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-09 09:25:14

试试这个:

代码语言:javascript
运行
复制
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR",ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);

KEEP:如果以前的worker存在,您的新尝试将被忽略,否则您的新worker将进入队列。

替换:如果存在以前的工人,它将被取消,导致它的状态为已取消。否则,您的新工作线程将被排入队列。

票数 1
EN

Stack Overflow用户

发布于 2020-05-09 06:58:54

好吧,这不是最好的方法,但是如果你在开始你的WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);之前取消所有的工作管理器任务会更好

检查队列中是否已经有Workmanager,然后不要在OnCreate中再次启动它。

票数 0
EN

Stack Overflow用户

发布于 2019-06-21 11:38:25

您将工作放入Activity#onCreate()中,因此每次创建活动时,都会将一个新的WorkRequest排入队列。这就是为什么您将看到工作请求的多个实例。您可能需要enqueueUniquePeriodicWork() API。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56686203

复制
相关文章

相似问题

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