একটি 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; }