WorkManager alpha10 ListenableFuture 用法

WorkManager alpha10 ListenableFuture usage

我在尝试实施最新的 WorkManager-alpha10 ListenableFuture 以处理流程完成时遇到一些问题。

现在我的 JobOrganizer class

上有以下内容
private fun enqueueDownloadWork(): ListenableFuture<Void> {
    val work = WorkManager.getInstance()
                   .beginWith(dwdTypologiesJob)
                   .then(dwdElementsJob)
                   .then(dwdAnomaliesJob)
    return work.enqueue()
}

private fun createDownloadWorkRequests() {
    dwdTypologiesJob = OneTimeWorkRequestBuilder<DWDAnomalyTypesJob>()
                .addTag("download_typologies_work")
                .build()
    dwdElementsJob = OneTimeWorkRequestBuilder<DWDElementsJob>()
                .addTag("download_elements_work")
                .build()
    dwdAnomaliesJob = OneTimeWorkRequestBuilder<DWDAnomaliesJob>()
                .addTag("download_anomalies_work")
                .build()
}

fun downloadData(): ListenableFuture<Void> {
    createDownloadWorkRequests()
    return enqueueDownloadWork()
}

这是我的调用,应该监听完成事件。

val listenable = JobOrganizer.downloadData()
listenable.addListener({
    Log.d("Listenable", "Did something 1");
}, {
    Log.d("Listenable", "Did something 2");
})

我仍然不知道 Runnable 和 Executor 如何处理这个函数。有人可以解释一下吗?

谢谢

你需要同时实例化Runnable和Executor,比如当你想在当前线程直接执行Runnable时:

.addListener(
    object:Runnable {
        override fun run() {
            Log.d("Listenable", "Did something 1");
        }
    },
    object:Executor {
        override fun execute(command: Runnable?) {
            command?.run()
        }
    }

您可以在 https://developer.android.com/reference/java/util/concurrent/Executor

上找到有关执行器的更多示例

对于 ListenableFutureRunnable 是您要在完成时 运行 的代码,Executor 告诉它如何 运行 该代码(例如,运行 它在哪个线程上)。

这应该适用于 Kotlin:

listenableFuture.addListener(
    { /* Runnable: Code to run */ },
    { /* Executor: How to run */ }
)

一些简单的执行器可能如下:

// Run on same thread (likely to be background thread):
{ it?.run }
// Run on main thread in android:
{ Handler(Looper.getMainLooper()).post(it) }
// Run with delay on main thread in android:
{ Handler(Looper.getMainLooper()).postDelayed(it, delayMillis) }

例如,ViewModel 中的用法可能如下所示:

val dataDownloaded = MutableLiveData<Boolean>()
fun beginDownload() {
    downloadData.result.addListener(
        { dataDownloaded.postValue(true) },
        { it?.run() }
    )
}