首页 文章

WorkManager - 运行定期任务

提问于
浏览
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类的新实例,因此会导致很多init代码再次运行,就像应用程序再次由用户运行一样(这会导致错误 - 积极的分析,API调用等) . 有没有办法避免/有一个标志,表明该应用程序是由 Worker 发起的?

1 回答

  • 0

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

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

    Demo是Java,但您可以在Kotlin中转换代码 .

    FYI: WorkManager 1.0.0-alpha05 is release now 因此您应该更新WorkManager版本,因为在其中修复了与PeriodicWorkRequest相关的一些问题 .

相关问题