ListenableFuture
는 비동기 계산의 결과를 나타냅니다.
아직 완료되지 않았거나 결과 생성이 완료되지 않았을 수 있는 계산입니다. 이것은
Future
유형
이 함수를 사용하면 계산이 완료된 후 실행되도록 콜백을 등록할 수 있습니다.
계산이 이미 완료된 경우 즉시 알림을 받습니다.
ListenableFuture
는 Android 프레임워크의 일부가 아니며 대신 제공됩니다.
작성자: Guava 자세한 내용은
ListenableFuture 설명을 참고하세요.
CameraX와 같은 많은 기존 Jetpack 라이브러리
또는 건강 관리 서비스에는 비동기 메서드가 있음
반환 유형은 다음의 상태를 나타내는 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 )
자바
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) }
자바
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가 비동기식은 아니지만 완료된 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) } }
자바
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; }