Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何观察Android WorkManager工作人员_Android_Android Workmanager - Fatal编程技术网

如何观察Android WorkManager工作人员

如何观察Android WorkManager工作人员,android,android-workmanager,Android,Android Workmanager,我目前的Android应用程序 archWorkerRuntimeVersion = '2.3.0-beta02' api "androidx.work:work-runtime:$archWorkerRuntimeVersion" api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion" 处理背景工作 当worker运行时,我会显示一个工具栏进度微调器,向我的用户发出应用程序“忙”的信号 我的应用程序由多个活动组成,我使用

我目前的Android应用程序

archWorkerRuntimeVersion = '2.3.0-beta02'

api "androidx.work:work-runtime:$archWorkerRuntimeVersion"
api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion"
处理背景工作

当worker运行时,我会显示一个工具栏进度微调器,向我的用户发出应用程序“忙”的信号

我的应用程序由多个活动组成,我使用Android JetPack ViewModels来管理工作人员

我开始的工作如下:-

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)
我的观察员定义如下:-

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)
还记得我的视图模型中的当前工作ID吗

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) 。由于我正在使用
现有工作策略。请保持
,我需要知道何时已经有后台工作处于活动状态,以便我不记得错误的工作id。目前我无条件地记得我尝试
排队()的上一个工作id
。是否有任何方法可以检测
何时存在工作策略。保留
结果不会启动新工作

2) 。当用户退出我的应用程序时,我将当前工作id存储在我的viewModel中,因此我丢失了此id。当用户重新进入我的应用程序时,我如何发现我是否有活动的工作人员

第2期)。我试过使用

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

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

鉴于您只想在工作程序运行时显示进度微调器,您可以实现一个更简单的解决方案,您的观察者只需检查一个工作程序中是否有一个工作程序

从中可以获得工作信息列表

另一种解决方案是使用您已经在使用的新工具

这样做的目的是在工作人员启动后(在构造函数中)立即发布进度:

您可以在已使用的观察者中检索进度。这种情况下的好处来自这样一个事实,即只有工作人员在运行时,进度信息才可用。
您仍然可以从UniqueWorkName请求所有工作信息,但只有在工作程序正在运行时,您才能获得进度

当工作人员处于最终状态时,WorkManager将负责删除进度信息