ListenableFuture
表示异步计算的结果:
计算可能尚未生成结果。这是一个
Future
的类型
让您可以注册在计算完成后执行的回调
或如果计算已经完成,则会立即完成。
ListenableFuture
不是 Android 框架的一部分,而是在框架内提供的
创作者:Guava。如需详细了解
实现,请参阅 ListenableFuture 说明。
许多现有的 Jetpack 库,例如 CameraX
或健康服务都有异步方法
其中返回值类型为 ListenableFuture
,表示
执行。在某些情况下,您可能需要实现一个返回
ListenableFuture
,例如以满足 TileService
的要求。
必需的库
Groovy
dependencies { implementation "com.google.guava:guava:31.0.1-android" // To use CallbackToFutureAdapter implementation "androidx.concurrent:concurrent-futures:1.2.0" // Kotlin implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.0" }
Kotlin
dependencies { implementation("com.google.guava:guava:31.0.1-android") // To use CallbackToFutureAdapter implementation("androidx.concurrent:concurrent-futures:1.2.0") // Kotlin implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.0") }
获取 ListenableFuture
的结果
添加回调
使用 Futures.addCallback(...)
辅助方法,用于将成功和失败回调附加到 ListenableFuture
。
Kotlin
val future: ListenableFuture<QueryResult> = ... Futures.addCallback( future, object : FutureCallback<QueryResult> { override fun onSuccess(result: QueryResult) { // handle success } override fun onFailure(t: Throwable) { // handle failure } }, // causes the callbacks to be executed on the main (UI) thread context.mainExecutor )
Java
ListenableFuture<QueryResult> future = ... Futures.addCallback( future, new FutureCallback<QueryResult>() { public void onSuccess(QueryResult result) { // handle success } public void onFailure(@NonNull Throwable thrown) { // handle failure } }, // causes the callbacks to be executed on the main (UI) thread context.getMainExecutor() );
Kotlin 中的挂起
使用 Kotlin 时,等待 ListenableFuture 结果的最简单方法
是使用 await()
。
import kotlinx.coroutines.guava.await ... val future: ListenableFuture<QueryResult> = ... val queryResult = future.await() // suspends awaiting success
与 RxJava 互操作
RxJava Single
可以ListenableFuture
通过在
SingleEmitter
。
Kotlin
val future: ListenableFuture<QueryResult> = ... val single = Single.create<QueryResult> { Futures.addCallback(future, object : FutureCallback<QueryResult> { override fun onSuccess(result: QueryResult) { it.onSuccess(result) } override fun onFailure(t: Throwable) { it.onError(t) } }, executor) }
Java
ListenableFuture<QueryResult> future = ... Single<QueryResult> single = Single.create( e -> Futures.addCallback(future, new FutureCallback<QueryResult>() { @Override public void onSuccess(QueryResult result) { e.onSuccess(result); } @Override public void onFailure(@NonNull Throwable thrown) { e.onError(thrown); } }, executor));
创建 ListenableFuture
创造近期的未来
如果您的 API 不是异步的,但您需要封装已完成的
操作转换为 ListenableFuture
,则可以创建 ImmediateFuture
。这个
使用 Futures.immediateFuture(...)
工厂方法。
Kotlin
fun getResult(): ListenableFuture<QueryResult> { try { val queryResult = getQueryResult() return Futures.immediateFuture(queryResult) } catch (e: Exception) { return Futures.immediateFailedFuture(e) } }
Java
public ListenableFuture<QueryResult> getResult() { try { QueryResult queryResult = getQueryResult(); return Futures.immediateFuture(queryResult); } catch (Exception e) { return Futures.immediateFailedFuture(e); } }
使用协程
在 Kotlin 中,future{ ... }
可用于将挂起函数的结果转换为 ListenableFuture
。
import kotlinx.coroutines.guava.future suspend fun getResultAsync(): QueryResult { ... } fun getResultFuture(): ListenableFuture<QueryResult> { return coroutineScope.future{ getResultAsync() } }
转换回调
如需将基于回调的 API 转换为使用 ListenableFuture
的 API,请使用
CallbackToFutureAdapter
。
此 API 由 androidx.concurrent:concurrent-futures
工件提供。
如需了解详情,请参阅 androidx.concurrent。
从 RxJava Single
转换
使用 RxJava 时,Single
可以转换为 SettableFuture
,
该类实现了 ListenableFuture
。
Kotlin
fun getResult(): ListenableFuture<QueryResult> { val single: Single<QueryResult> = ... val future = SettableFuture.create<QueryResult>() single.subscribe(future::set, future::setException) return future }
Java
public ListenableFuture<QueryResult> getResult() { Single<QueryResult> single = ... SettableFuture<QueryResult> future = SettableFuture.create(); single.subscribe(future::set, future::setException); return future; }