如何观察Android WorkManager工人

问题描述 投票:1回答:1

我当前的Android应用程序使用的是>>

archWorkerRuntimeVersion = '2.3.0-beta02'

api "androidx.work:work-runtime:$archWorkerRuntimeVersion"
api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion"

处理后台工作。

[当工作者正在运行时,我显示一个工具栏进度微调器,以向用户表明该应用程序处于“忙碌”状态。

我的应用程序包含多个活动,并且我使用Android JetPack ViewModels管理Worker。

我按如下方式开始工作:-

val myWorkRequest: OneTimeWorkRequest =
    OneTimeWorkRequest.Builder(MyWorker::class.java)
        .addTag(WORK_IN_PROGRESS_TAG + "${UUID.randomUUID()}").build()

    WorkManager.getInstance(applicationContext)
        .beginUniqueWork(
            UNIQUE_WORK_NAME,
            ExistingWorkPolicy.KEEP,
            myWorkRequest
        )
        .enqueue()

我的观察者定义如下:-

private val observer = Observer<WorkInfo> { workInfo ->

    when(workInfo.state) {
        WorkInfo.State.RUNNING -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
        WorkInfo.State.ENQUEUED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
        WorkInfo.State.SUCCEEDED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
        WorkInfo.State.FAILED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
        WorkInfo.State.BLOCKED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
        WorkInfo.State.CANCELLED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
    }

}

我观察工作如下:-

 WorkManager.getInstance(applicationContext)
            .getWorkInfoByIdLiveData(myWorkRequest.id)
            .observe(lifeCycleOwner, observer)

并记住我的视图模型中的当前workId

class MyViewModel : ViewModel() {

    private var currentWorkInfoId: UUID? = null


  fun startWorkTags(lifeCycleOwner: LifecycleOwner, applicationContext: Context) {

        val myWorkRequest: OneTimeWorkRequest =
    OneTimeWorkRequest.Builder(MyWorker::class.java)
        .addTag(WORK_IN_PROGRESS_TAG + "${UUID.randomUUID()}").build()

    WorkManager.getInstance(applicationContext)
        .beginUniqueWork(
            UNIQUE_WORK_NAME,
            ExistingWorkPolicy.KEEP,
            myWorkRequest
        )
        .enqueue()

        currentWorkInfoId = myWorkRequest.id
   }
}

我有以下问题

1)。当我使用ExistingWorkPolicy.KEEP时,我需要知道什么时候已经有后台工作处于活动状态,这样我就不会记住错误的工作ID。目前,我无条件记住我尝试输入的上一个工作ID enqueue()。有什么方法可以检测到ExistingWorkPolicy.KEEP何时导致没有新的工作开始?

2)。当用户退出我的应用程序时,由于我将当前工作ID存储在viewModel中,因此我丢失了此ID。当用户重新输入我的应用程序时,如何发现我是否有在职员工?

对于问题2)。我已经尝试使用

 WorkManager.getInstance(applicationContext)
            .getWorkInfosForUniqueWorkLiveData(UNIQUE_WORK_NAME)
            .observe(lifeCycleOwner, observerUnique)

但是这种方法“看到”了所有以前的工作程序执行,我如何识别最新的工作程序实例?

我当前的Android应用程序使用archWorkerRuntimeVersion ='2.3.0-beta02'api“ androidx.work:work-runtime:$archWorkerRuntimeVersion” api“ androidx.work:work-runtime-ktx:$ ...

android android-workmanager
1个回答
0
投票
鉴于您只想在Worker运行时显示进度条,您可以实现一个更简单的解决方案,您的观察者只需检查non-final state中是否有一个Worker。
© www.soinside.com 2019 - 2024. All rights reserved.