【问题标题】:WorkManager - running periodic taskWorkManager - 运行周期性任务
【发布时间】:2018-07-22 12:59:03
【问题描述】:

我想使用新的 WorkManager 每 3 小时运行一次定期任务。 创建应用程序时启动的工作人员。 我为此使用以下代码:

public class ApplicationCommon extends MultiDexApplication {

@Override
public void onCreate() {
    super.onCreate();


    ... some init code
    // some code that I don't want to run again for every periodic worker...
    ... some analytics 
}

MainActivity 内部

@Override
public void onCreate() {
    super.onCreate();
    runCouponValidatorWorker()
}

fun runCouponValidatorWorker() {
    val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
    val worker = PeriodicWorkRequestBuilder<CouponValidatorWorker>(3, TimeUnit.HOURS).setConstraints(constraints).build()
    WorkManager.getInstance()?.enqueueUniquePeriodicWork("couponValidatorWorker", ExistingPeriodicWorkPolicy.REPLACE, worker)
}

但是,似乎worker在定期运行时,每次都会创建一个Application类的新实例,因此会导致大量init代码再次运行,就好像应用程序再次被用户运行一样(这会导致误报分析、API 调用等)。有没有办法避免这种情况/有一个标志表明应用程序是由工作人员启动的?

【问题讨论】:

  • 您使用的是哪个 WorkManager 版本?为什么你在 Application 类而不是 Activity 中编写 WorkManager 代码?
  • 1.0.0-alpha04。你是对的(更新的问题),它应该在一个活动课上。无论如何,有没有办法知道应用程序是否因为工人而再次启动?
  • 是否写在文档中的某处应该在活动中初始化?我找不到任何想法,而不是 this codelab,它在 ViewModel 中初始化。

标签: android android-workmanager


【解决方案1】:

请参阅此PeriodicWorkRequest GitHub demo 并根据您的要求(即 3 小时)在 DayIncrementViewModel.java 中更新 TimeUnit。它将根据您的需要工作。

要检查您的工作是否已启动,您可以在安排工作请求时将 UUID 存储在会话中。如果 UUID 为 null 或空白,则您的 WorkRequest 不会启动。
您还可以使用该 UUID 检查工作状态。查看this link 了解更多详情。

演示是用 Java 编写的,但您可以在 Kotlin 中转换代码。

仅供参考:WorkManager 1.0.0-alpha05 现已发布,因此您应该更新 WorkManager 版本,因为其中修复了与 PeriodicWorkRequest 相关的一些问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-07-10
    • 2021-02-05
    • 2013-06-08
    • 2019-05-25
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多