我正在尝试通过创建一个每5天重复一次的周期性Worker来使用WorkManger。
我正在使用华为Android 7设备(API 24)上的1.0.0版工作管理器
android.arch.work:work-runtime:1.0.0
这是代码:
fun schedule() {
val constraints: Constraints = Constraints.Builder().apply {
setRequiredNetworkType(NetworkType.CONNECTED)
}.build()
val request = PeriodicWorkRequest
.Builder(MyWorker::class.java, 5, TimeUnit.DAYS)
.setConstraints(constraints)
.build()
WorkManager.getInstance()
.enqueueUniquePeriodicWork(MyWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, request)
}
MyWorker:
class MyWorker(appContext: Context, workerParams: WorkerParameters)
: Worker(appContext, workerParams) {
override fun doWork(): Result {
return try {
Thread.sleep(5000)
Timber.i("success")
Result.success()
} catch (e: Exception) {
Timber.e(e, "error")
Result.failure()
}
}
方法schedule()
在MainActivity的onCreate()
中被调用。
当我第一次安装该应用程序时,Worker只运行一次。另外在日志中,我看到此错误:
CancellationException task was canceled
我在做什么错? 谢谢。
答案 0 :(得分:0)
第一步是使用最新的WorkManager版本,因为您似乎仍然使用非常旧的版本:
https://developer.android.com/jetpack/androidx/releases/work
通过看到您的代码,您不太可能超出工作时间限制(大约10分钟)。 From the documentation,取消作品的某些原因是:
也就是说,华为之间的几家制造商实施了非常激进的应用程序销毁,除非最近打开了该应用程序,否则它们甚至不遵守计划:
https://issuetracker.google.com/issues/122098785
答案 1 :(得分:0)
根据PerracoLabs的回答,
对于独特的工作,您使用REPLACE的ExistingWorkPolicy将新的WorkRequest显式排队。旧的WorkRequest立即被视为已取消。
请仅安排一次工作。您可以使用SharedPreference来检查是否已安排工作。如果不是,请安排工作并将SharedPreference设置为true。
编辑
根据官方文档,
下一次执行将在时间间隔内进行;请注意,执行时间可能会延迟,因为WorkManager受到操作系统电池优化的影响,例如打mode模式。
请检查工作是否完全没有执行或延迟。
答案 2 :(得分:0)
我不确定您所获得的CancellationException
,但您已经明确地说过您拥有的设备是华为设备。作为华为用户,我之前也遇到过相同的问题,第一次完成了工作,而在15分钟后(这是我的要求),如果应用程序在后台运行,则工作不会执行。原因是华为是一种特殊的设备。在普通的Android或AOSP Android上,您将不会观察到这种行为,因为它们允许完成工作。但是,中国制造商,例如华为或小米,将压制该作品,并将其撤消。
我有一个Huawei P20 Lite,为此我找到的解决方案是
转到设置->电池->应用启动(或类似的东西)->在列表中,找到您的应用->单击您的应用或单击右侧的开关->选择“管理手动”并允许“在后台运行”。
此调整之后,作品开始按原计划执行。很抱歉,但这与您的代码无关,这完全是制造商的错。