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