如果对链请求使用唯一的工作,则WorkStatus被阻止

时间:2018-08-24 09:53:06

标签: android android-jetpack android-workmanager

以下是代码

var syncItemWork = OneTimeWorkRequestBuilder<SyncItemWorker>().addTag(SYNC_ITEM_ONE_TIME).build()

    var pullMastersWork = OneTimeWorkRequestBuilder<SyncMasterWorker>().addTag(SYNC_MASTER_ONE_TIME).build()

    var pullLabelsWork = OneTimeWorkRequestBuilder<SyncLabelWorker>().addTag(SYNC_LABEL_ONE_TIME).build()

    var syncMovementWork = OneTimeWorkRequestBuilder<SyncMovementWorker>().addTag(SYNC_MOVEMENT_ONE_TIME).build()

 var continuation = WorkManager.getInstance().beginUniqueWork("manual_sync", ExistingWorkPolicy.APPEND, pullMastersWork)
                .then(pullLabelsWork)
                .then(syncMovementWork)
                .then(syncItemWork)
        continuation.enqueue()
  

为了检查状态,我使用以下代码:

 WorkManager.getInstance().getStatusById(syncItemWork.id).observe(this,
            Observer { status ->
                Timber.d("getStatusById:$status")
                if (status != null && status.state.isFinished) {
                    manualSync.isEnabled = true
                    GlideApp.with(this).load(R.drawable.ic_sync).diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(ivManualSync)

                    var lastSyncTime = DateUtils.getRelativeTimeSpanString(PreferenceManager.getDefaultSharedPreferences(activity as Context).getLong(PREF_KEY_LAST_SYNC_TIME, 0),
                            System.currentTimeMillis(),
                            DateUtils.SECOND_IN_MILLIS,
                            DateUtils.FORMAT_ABBREV_RELATIVE
                    )
                    view.findViewById<TextView>(R.id.txtName).text = lastSyncTime
                }
            })

工作没有进入队列,状态为BLOCKED,并且在日志中显示: 由于前提条件未成功完成而当前被阻止的工作状态

1 个答案:

答案 0 :(得分:0)

您的Worker有没有完成?

您正在使用APPEND,因此创建了一个很长的工作继续时间。如果您无法正确处理错误条件,那么您必然会陷入以下状态:后续Worker被先决条件阻止,或者它们完全失败,因为在某个时刻{{1} }。如果您想执行最新的链,也许可以考虑使用FAILED代替?