enqueueUniquePeriodicWork的PeriodicWork无法正常工作

时间:2019-04-04 09:49:43

标签: android android-jetpack android-workmanager

我正在尝试通过创建一个每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

我在做什么错? 谢谢。

3 个答案:

答案 0 :(得分:0)

第一步是使用最新的WorkManager版本,因为您似乎仍然使用非常旧的版本:

https://developer.android.com/jetpack/androidx/releases/work

通过看到您的代码,您不太可能超出工作时间限制(大约10分钟)。 From the documentation,取消作品的某些原因是:

  • 您明确要求将其取消(通过致电 例如,WorkManager.cancelWorkById(UUID)。
  • 在 独特的工作,您明确地将新的WorkRequest与 REPLACE的现有工作政策。旧的WorkRequest立即 被认为已取消。
  • 您的工作限制不再得到满足。
  • 系统指示您的应用出于某种原因停止工作。如果您超过10分钟的执行期限,就会发生这种情况。该工作计划在以后重试。

也就是说,华为之间的几家制造商实施了非常激进的应用程序销毁,除非最近打开了该应用程序,否则它们甚至不遵守计划:

https://issuetracker.google.com/issues/122098785

https://issuetracker.google.com/issues/122098785#comment41

https://issuetracker.google.com/issues/122098785#comment74

答案 1 :(得分:0)

根据PerracoLabs的回答,

对于独特的工作,您使用REPLACE的ExistingWorkPolicy将新的WorkRequest显式排队。旧的WorkRequest立即被视为已取消。

请仅安排一次工作。您可以使用SharedPreference来检查是否已安排工作。如果不是,请安排工作并将SharedPreference设置为true。

编辑

根据官方文档,

下一次执行将在时间间隔内进行;请注意,执行时间可能会延迟,因为WorkManager受到操作系统电池优化的影响,例如打mode模式。

请检查工作是否完全没有执行或延迟。

答案 2 :(得分:0)

我不确定您所获得的CancellationException,但您已经明确地说过您拥有的设备是华为设备。作为华为用户,我之前也遇到过相同的问题,第一次完成了工作,而在15分钟后(这是我的要求),如果应用程序在后台运行,则工作不会执行。原因是华为是一种特殊的设备。在普通的Android或AOSP Android上,您将不会观察到这种行为,因为它们允许完成工作。但是,中国制造商,例如华为小米,将压制该作品,并将其撤消。

我有一个Huawei P20 Lite,为此我找到的解决方案是

转到设置->电池->应用启动(或类似的东西)->在列表中,找到您的应用->单击您的应用或单击右侧的开关->选择“管理手动”并允许“在后台运行”。

此调整之后,作品开始按原计划执行。很抱歉,但这与您的代码无关,这完全是制造商的错。