WorkManager不重复执行PeriodicWorkRequest

20

我正在创建一款安卓应用程序,用于在后台运行我的代码。我很清楚 Android Oreo 对后台服务引入的限制,所以我正在使用 WorkManager API 来安排任务执行。我正在 Mi Max 设备上进行代码测试,该设备使用 Android API 24 (Nougat),并手动启用自动启动,以便 MIUI 允许应用在后台运行,但问题是,WorkManager 在应用程序第一次启动时触发,但之后就不起作用了。以下是我用于定期工作请求和工作本身的代码。

PeriodicWorkRequest 调用:

PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES)
            .setConstraints(Constraints.NONE)
            .build();
WorkManager.getInstance().enqueue(work);

扩展Worker的类:

public Result doWork() {
    /*--- SHOWING NOTIFICATION AS AN EXAMPLE TASK TO BE EXECUTED ---*/
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), "")
            .setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
            .setContentTitle("TestApp")
            .setContentText("Code executed")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
    notificationManager.notify(1234, mBuilder.build());

    return Result.SUCCESS;
}

Workmanager与PeriodicWorkRequest不起作用。它只将工作排队一次,而不会给出isFinished()为true的结果。 - SANAT
那么,这是他们那边的问题吗?还是WorkManager为节能而设置的工作模式? - Madhusudan Sharma
与android.arch.work:work-runtime:1.0.1相同的问题。 - Shubham AgaRwal
第二个答案应该是被接受的答案,而不是第一个答案。 - Abhilash Das
请按照此链接 https://stackoverflow.com/a/77264413/4997704 查看翻译后的文本。 - undefined
5个回答

24

根据文档:

 /**
 * The minimum interval duration for {@link PeriodicWorkRequest} (in milliseconds).
 */
public static final long MIN_PERIODIC_INTERVAL_MILLIS = 15 * 60 * 1000L; // 15 minutes.
/**
 * The minimum flex duration for {@link PeriodicWorkRequest} (in milliseconds).
 */
public static final long MIN_PERIODIC_FLEX_MILLIS = 5 * 60 * 1000L; // 5 minutes.

如果您将这两个值设置为小于指定的最小值,则必须等待约20分钟才能查看日志/输出


如何设置小于最小规定值? - roghayeh hosseini
这是不可能的。 - Abhilash Das
是的,当我将时间段设置为大于或等于15分钟时,它可以正常工作!谢谢。 - Oleksandr Nos
什么是Flex Millis?我应该设置什么值?它们可以相同吗? - user924

13

如果您使用周期性工作请求(PeriodicWorkRequest),并且间隔小于15分钟,应该返回Result.retry()而不是成功或失败。


2
这是不正确的!这将线性重试,例如第一次在1分钟后,第二次在3分钟后,第三次在6分钟后...因此没有所需的清晰间隔。 - Vlad
请按照此链接 https://stackoverflow.com/a/77264413/4997704 查看翻译后的文本。 - undefined

5

请将您的 WorkManager 版本更新至 1.0.0-alpha04 。 您可以在这里查看发布说明。

此外,请参考 PeriodicWorkRequest GitHub 演示 ,并根据您的需求在 DayIncrementViewModel.java 中更新 TimeUnit。它会按照您的要求工作。

由于 WorkManager 仍处于 alpha 模式,因此一旦发布最终版本,它将完全适用于所有设备。


1
这对奥利奥版本有效吗?我测试了这个应用程序。它在Nougat上运行良好,但在Oreo上不起作用。顺便说一下,我已将PeriodicWorkRequest更改为10分钟。 - shakunthalaMK
2
@shakunthalaMK PeriodicWorkRequest 的默认时间是 15 分钟。所以在 15 分钟以下,它将无法正常工作。此外,它不会在正好 15 分钟时触发,而是大约在 15 分钟左右执行。如果您想每 10 分钟或在任何特定时间段执行任何任务,则必须使用 Alarm Manager。 - Viraj Patel
1
@shakunthalaMK WorkManager 的最新版本是 1.0.0-alpha07,因此请使用最新版本,因为在 1.0.0-alpha04 之后解决了一些与 PeriodicWorkRequest 相关的问题。 - Viraj Patel
1
嘿,它在奥利奥上运行良好。正如你所说,在某些情况下触发需要超过15分钟的时间。最后一个疑问...当应用程序被杀死时,它是否仍然有效?谢谢。 - shakunthalaMK
与android.arch.work:work-runtime:1.0.1相同的问题。 - Shubham AgaRwal
显示剩余5条评论

2
将弹性间隔和弹性单位添加到构建器构造函数中。在我的情况下,这开始起作用了。
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES, 5, TimeUnit.MINUTES)

嗨,我遇到了一个问题,我的定期请求只有在使用弹性周期时才能正常工作。你有解释吗?或者你现在做了什么不同的事情吗? - rial

0
我通过在工作管理器中更改这些代码来解决了问题。
  1. 在Worker类中使用try & catch块来获取Result.success()和Result.failure()
  2. 将ExistingPeriodicWorkPolicy从KEEP更改为UPDATE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接