0

我想使用新的 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)
}

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

4

1 回答 1

0

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

要检查您的工作是否已启动,您可以在安排工作请求时将 UUID 存储在会话中。如果 UUID 为 null 或空白,则您的 WorkRequest 不会启动。
您还可以使用该 UUID 检查工作状态。检查此链接以获取更多详细信息。

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

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

于 2018-07-25T05:18:26.167 回答