如何使用Android CoroutineWorkers将失败的子Worker中的数据传递给链中的最后一个Worker

3

我的当前Android应用程序使用链接的工作线程执行复杂的后台任务。

到目前为止,我只观察链中的最后一个工作线程,以检测整个链是否已成功完成。这种方法目前是可以接受的,但我有一个新要求,需要在工作线程失败时传递数据。

我的唯一选择是开始观察链中的所有工作线程吗?

还是

是否可能在失败的子工作线程中设置输出数据,并从观察到的最后一个工作线程得到的WorkInfo中访问它?

例如,如果我有一个由5个顺序工作线程组成的链如下:

WorkerA
WorkerB
WorkerC
WorkerD
WorkerZ

我只观察WorkerZ,而WorkerC失败并在其结果中设置了outputData,是否有办法让我仅通过观察WorkerZ就可以访问该WorkData?

1个回答

0

没有必要观察所有的工作进程。如果你在每个工作进程中返回 Result.failure 数据,你可以轻松地找到哪个工作进程失败了以及它的输出数据是什么:

 WorkManager.getInstance(context)
        .getWorkInfosForUniqueWorkLiveData(UNIQUE_WORK_NAME)
        .observeForever { workInfos ->
            if(it.state == WorkInfo.State.FAILED){ //failed worker
                  val failureResult = it.outputData
            }
        }

或者像这样:

val failureResult = WorkManager.getInstance(context)
        .getWorkInfosForUniqueWork(UNIQUE_WORK_NAME)
        .get()
        .firstOrNull{
            it.state == WorkInfo.State.FAILED
        }
        ?.outputData

这种方法看起来是一个不错的选择,但是有很多情况它并不能按照要求工作。例如当退出并重新进入应用程序时,以及一旦多个相同的唯一工作已经执行并失败(或未失败),观察者就会接收到已经处理过的workInfos。 - Hector
你提到的这两种情况是不同的问题。对于第一种情况,getWorkInfosForUniqueWork函数返回一个LiveData,你可以自行决定如何观察它。例如,你可以使用observeForever或使用lifeCycleOwner观察它,并处理退出和重新进入应用程序的情况。 - Farid
对于第二种情况,您可以使用不同的值替代UNIQUE_WORK_NAME并观察您想要的链的结果。 - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接