我想使用新的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 回答
请参阅此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相关的一些问题 .