ListenableFuture ব্যবহার করা

ListenableFuture একটি অ্যাসিঙ্ক্রোনাস কম্পিউটেশনের ফলাফল দেখায়: এমন একটি কম্পিউটেশন যা এখনও ফলাফল তৈরি করা শেষ করতে পারে বা নাও করতে পারে। এটি এক ধরনের Future যা আপনাকে কম্পিউটেশন সম্পূর্ণ হলে বা কম্পিউটেশন আগে থেকেই সম্পূর্ণ হয়ে থাকলে, অবিলম্বে কার্যকর করার জন্য কলব্যাক রেজিস্টার করার অনুমতি দেয়।

ListenableFuture Android ফ্রেমওয়ার্কের অংশ নয় এবং এর পরিবর্তে Guava দ্বারা প্রদান করা হয়। এই ক্লাস প্রয়োগ করার ব্যাপারে আরও তথ্য পেতে, ListenableFuture-এর ব্যাখ্যা দেখুন।

CameraX বা Health Services-এর মতো আগে থেকে থাকা অনেক Jetpack লাইব্রেরিতে অ্যাসিঙ্ক্রোনাস পদ্ধতি আছে যেখানে রিটার্ন টাইপ হল ListenableFuture যা এক্সিকিউশনের স্ট্যাটাস দেখায়। কিছু ক্ষেত্রে আপনাকে এমন একটি পদ্ধতি প্রয়োগ করতে হতে পারে যা ListenableFuture রিটার্ন করে, যেমন TileService-এর প্রয়োজনীয়তা পূরণ করা।

প্রয়োজনীয় লাইব্রেরি

গ্রুভি

dependencies {
    implementation "com.google.guava:guava:31.0.1-android"

    // To use CallbackToFutureAdapter
    implementation "androidx.concurrent:concurrent-futures:1.3.0"

    // Kotlin
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.0"
}

কোটলিন

dependencies {
    implementation("com.google.guava:guava:31.0.1-android")

    // To use CallbackToFutureAdapter
    implementation("androidx.concurrent:concurrent-futures:1.3.0")

    // Kotlin
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.0")
}

ListenableFuture-এর ফলাফল পাওয়া

কলব্যাক যোগ করা হচ্ছে

ListenableFuture-এ সফল ও ব্যর্থ কলব্যাক অ্যাটাচ করতে Futures.addCallback(...) হেল্পার পদ্ধতি ব্যবহার করুন।

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-র সাথে ইন্টারঅপারেবিলিটি

SingleEmitter-এর মধ্যে কলব্যাক রেজিস্টার করে ListenableFuture থেকে RxJava Single তৈরি করা যেতে পারে।

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 অ্যাসিঙ্ক্রোনাস না হলে, কিন্তু আপনাকে সম্পূর্ণ হওয়া অপারেশনের ফলাফল 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
}

জাভা

public ListenableFuture<QueryResult> getResult() {
    Single<QueryResult> single = ...

    SettableFuture<QueryResult> future = SettableFuture.create();
    single.subscribe(future::set, future::setException);
    return future;
}