একটি Listenable Future ব্যবহার করে

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

ListenableFuture অ্যান্ড্রয়েড ফ্রেমওয়ার্কের অংশ নয় এবং এর পরিবর্তে Guava দ্বারা সরবরাহ করা হয়েছে। এই শ্রেণীর বাস্তবায়ন সম্পর্কে আরও তথ্যের জন্য, Listenable Future ব্যাখ্যা করা দেখুন।

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

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

গ্রোভি

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

কোটলিন

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 এর ফলাফল পাওয়া

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

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

কোটলিন

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 ব্যবহার করার সময়, ListenableFuture-এর ফলাফলের জন্য অপেক্ষা করার সবচেয়ে সহজ উপায় হল await() ব্যবহার করা।

import kotlinx.coroutines.guava.await

...

val future: ListenableFuture<QueryResult> = ...
val queryResult = future.await() // suspends awaiting success

RxJava এর সাথে ইন্টারপ করুন

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

কোটলিন

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(...) কারখানা পদ্ধতি ব্যবহার করে করা যেতে পারে।

কোটলিন

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

একটি coroutine ব্যবহার করে

কোটলিনে, একটি future{ ... } একটি সাসপেন্ড ফাংশনের ফলাফলকে ListenableFuture এ রূপান্তর করতে ব্যবহার করা যেতে পারে।

import kotlinx.coroutines.guava.future

suspend fun getResultAsync(): QueryResult { ... }

fun getResultFuture(): ListenableFuture<QueryResult> {
    return coroutineScope.future{
        getResultAsync()
    }
}

একটি কলব্যাক রূপান্তর

ListenableFuture ব্যবহার করে এমন একটি কলব্যাক-ভিত্তিক API রূপান্তর করতে, CallbackToFutureAdapter ব্যবহার করুন। এই APIটি androidx.concurrent:concurrent-futures artifact দ্বারা সরবরাহ করা হয়েছে।

আরও তথ্যের জন্য androidx.concurrent দেখুন।

RxJava Single থেকে রূপান্তর করা হচ্ছে

RxJava ব্যবহার করার সময়, একটি Single একটি SettableFuture এ রূপান্তরিত করা যেতে পারে, যা ListenableFuture প্রয়োগ করে।

কোটলিন

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