ListenableFuture 사용

ListenableFuture는 비동기 계산의 결과를 나타냅니다. 아직 완료되지 않았거나 결과 생성이 완료되지 않았을 수 있는 계산입니다. 이것은 Future 유형 이 함수를 사용하면 계산이 완료된 후 실행되도록 콜백을 등록할 수 있습니다. 계산이 이미 완료된 경우 즉시 알림을 받습니다.

ListenableFuture는 Android 프레임워크의 일부가 아니며 대신 제공됩니다. 작성자: Guava 자세한 내용은 ListenableFuture 설명을 참고하세요.

CameraX와 같은 많은 기존 Jetpack 라이브러리 또는 건강 관리 서비스에는 비동기 메서드가 있음 반환 유형은 다음의 상태를 나타내는 ListenableFuture입니다. 실행할 수도 있습니다 경우에 따라 ListenableFuture(예: TileService의 요구사항 충족)

<ph type="x-smartling-placeholder">

필수 라이브러리

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;
}