带有 enqueueUniquePeriodicWork 的 PeriodicWork 不起作用

smo*_*e89 6 android android-jetpack android-workmanager

我试图通过创建一个每 5 天重复一次的定期 Worker 来使用 WorkManger。

我在华为 Android 7 设备 (API 24) 上使用 1.0.0 版 workmanagers

android.arch.work:work-runtime:1.0.0
Run Code Online (Sandbox Code Playgroud)

这是代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

我的工人:

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()
        }
    }
Run Code Online (Sandbox Code Playgroud)

该方法在 MainActivity 中schedule()调用onCreate()

当我第一次安装应用程序时,Worker 只运行一次。同样在日志中,我看到了这个错误: CancellationException task was canceled

我究竟做错了什么?谢谢。

Per*_*abs 0

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

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

通过查看您的代码,您不太可能超出工作时间限制(大约 10 分钟)。从文档来看,作品被取消的一些原因是:

  • 您明确要求取消它(例如,通过调用 WorkManager.cancelWorkById(UUID))。
  • 对于唯一工作,您显式地将 ExistingWorkPolicy 为 REPLACE 的新 WorkRequest 排入队列。旧的 WorkRequest 立即被视为已取消。
  • 您的工作限制不再满足。
  • 系统指示您的应用程序因某种原因停止您的工作。如果超过 10 分钟的执行期限,就会发生这种情况。该工作计划稍后重试。

也就是说,包括华为在内的几家制造商实施了非常激进的应用程序查杀,除非应用程序最近打开过,否则它们甚至不尊重调度:

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

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

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