首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓中的WorkManger正在执行doWork()不止一次

安卓中的WorkManger正在执行doWork()不止一次
EN

Stack Overflow用户
提问于 2018-09-24 20:59:42
回答 2查看 2.1K关注 0票数 5

我使用WorkManager来调度一些任务,但问题是工作管理器在单个调用中执行这些任务{ doWork() }不止一次。

我正在使用:

代码语言:javascript
复制
'android.arch.work:work-runtime:1.0.0-alpha08'

我试过使用-alpha07,06,05,04。但我也有同样的问题。有时它甚至一次执行5-6次。

以下是代码:

代码语言:javascript
复制
public class MyWorker extends Worker {

@NonNull
@Override
public Result doWork() {

    Log.i("CountWorker","0");
    sendNotification("Notice", "A notice was sent");
    return Result.SUCCESS;

}

这就是我们的活动

代码语言:javascript
复制
public class MyWorkerActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final PeriodicWorkRequest pwr = new PeriodicWorkRequest
            .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
            .setConstraints(Constraints.NONE)
            .build();

    WorkManager.getInstance().enqueue(pwr);

}
}

这是Logcat的结果:

代码语言:javascript
复制
09-24 16:44:35.954 22779-22816/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.970 22779-22817/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.977 22779-22818/com.simran.powermanagement I/CountWorker: 0
EN

回答 2

Stack Overflow用户

发布于 2018-09-25 02:58:45

当您enqueue一个PeriodicWorkRequest时,这会使而不是取消以前排队的任何现有PeriodicWorkRequest。因此,当您编写应用程序时,每次活动开始时,您都会添加定期的工作请求,慢慢地从1到2到3开始。

相反,您希望使用enqueueUniquePeriodicWork()

此方法允许您对唯一命名的PeriodicWorkRequest进行排队,其中一次只能激活一个具有特定名称的PeriodicWorkRequest。例如,您可能只希望一个同步操作处于活动状态。如果有一个挂起,您可以选择让它运行,或者用您的新工作替换它。uniqueWorkName唯一标识此PeriodicWorkRequest。

使用代码,例如:

代码语言:javascript
复制
final PeriodicWorkRequest pwr = new PeriodicWorkRequest
        .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
        .setConstraints(Constraints.NONE)
        .build();

WorkManager.getInstance().enqueueUniquePeriodicWork(
    "my_worker",
    ExistingPeriodicWorkPolicy.REPLACE,
    pwr);
票数 10
EN

Stack Overflow用户

发布于 2019-01-09 12:40:21

对于使用1.0.0-beta01版本的OneTimeWorkRequest

代码语言:javascript
复制
WorkManager.getInstance()
            .beginUniqueWork("Unique", ExistingWorkPolicy.KEEP, oneTimeWorkRequest)
            .enqueue();

取消现有序列并将其替换为新序列。

保留现有序列,忽略新请求。

将新序列追加到现有序列,在现有序列的最后一个任务完成后运行新序列的第一个任务

正式文件。https://developer.android.com/topic/libraries/architecture/workmanager/advanced

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

https://stackoverflow.com/questions/52487305

复制
相关文章

相似问题

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