如何在 Android 中从 WorkManager 获取实时数据

And*_*ice 6 android kotlin android-livedata android-jetpack android-workmanager


我正在尝试从WorkManagerdoWork()的方法进行 API 调用。我收到了一份回复清单。如何将这个复杂对象设置为 WorkManager 的输出?MutableLiveData

请在下面找到相同的实现:

class FetchWorkManager(context: Context, params: WorkerParameters): Worker(context, params) {
    var postInfoLiveData: LiveData<List<PostInfo>> = MutableLiveData()

    @SuppressLint("RestrictedApi")
    override fun doWork(): Result {
        fetchInfoFromRepository()
        // Setting output data
        val data = Data.Builder()
            .putAll(postInfoLiveData)
            //.put("liveData", postInfoLiveData)
            .build()
        return Result.success(data)
    }


    fun fetchInfoFromRepository() {
        val retrofitRepository = RetrofitRepository()
        postInfoLiveData = retrofitRepository.fetchPostInfoList()
    }
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决这个问题?

art*_*art 2

Worker从with成员返回结果不是预期的行为LiveData。的结果Worker应该作为startWork方法的返回值返回。可以使用Result一些数据方法来构造对象。ListenableWorker.Result.success

const val WORKER_RESULT_INT = "WORKER_RESULT_INT"

class WorkerWithOutput(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        // do some work
        return Result.success(Data.Builder().putInt(WORKER_RESULT_INT, 123).build())
    }
}
Run Code Online (Sandbox Code Playgroud)

要从外部获取此数据,getWorkInfoXXX应使用其中一种方法。

fun getResult(context: Context, owner: LifecycleOwner, id: UUID) {
    WorkManager.getInstance(context)
            .getWorkInfoByIdLiveData(id)
            .observe(owner, Observer {
                if (it.state == WorkInfo.State.SUCCEEDED) {
                    val result = it.outputData.getInt(WORKER_RESULT_INT, 0)
                    // do something with result
                }
            })
}
Run Code Online (Sandbox Code Playgroud)

活动或片段可以作为传递LifecycleOwner(取决于您的情况)。WorkRequest.getId用于完成id工作。

值得注意的是,ListenableWorker.setProgressAsync在这种情况下,它也很有用。