我当前的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:$ ...