narjes Mansoori
narjes Mansoori
خواندن ۲ دقیقه·۱۰ ماه پیش

آشنایی با مفهوم callbackFlow در کروتین

در واقع callbackFlow یک FlowBuilder در کاتلین است که به شما امکان می‌دهد یک فلو را از طریق یک Callback تولید کنید. حالتی که می‌توانید از callbackFlow استفاده کنید، زمانی است که یک کتابخانه یا API از Callback برای اعلام وقوع رویدادها یا بازخورد استفاده می‌کند و شما می‌خواهید این رویدادها را به صورت یک فلو در برنامه خود استفاده کنید.

حالا با یک مثال از چگونگی استفاده از callbackFlow آشنا شویم:

import kotlinx.coroutines.*
// شبیه‌سازی یک کلاس LocationManager
class LocationManager {
private var locationListener: ((Location) -> Unit)? = null
// تابع برای ثبت نام listener برای به‌روزرسانی‌های مکان
fun registerForLocation(listener: (Location) -> Unit) {
locationListener = listener
}

// تابع برای لغو ثبت نام listener
fun unregisterForLocation() {
locationListener = null
}

// شبیه‌سازی یک رویداد به روزرسانی مکان
fun simulateLocationUpdate(location: Location) {
locationListener?.invoke(location)
}
}

// تعریف کلاس Location
data class Location(val latitude: Double, val longitude: Double)

// تابع ایجاد فلوی مکان
fun getLocationFlow(locationManager: LocationManager): Flow<Location> {
return callbackFlow {
// ثبت نام listener برای به‌روزرسانی‌های مکان
val listener: (Location) -> Unit = { location ->
// ارسال مکان به عنوان یک رویداد در فلو
trySend(location)
}
locationManager.registerForLocation(listener)

// لغو ثبت نام listener در زمان خاتمه فلو
awaitClose {
locationManager.unregisterForLocation()
}
}
}

suspend fun main() {
val locationManager = LocationManager()

// ایجاد فلوی مکان
val locationFlow = getLocationFlow(locationManager)

// اشتراک‌گذاری مکان‌ها
val job = GlobalScope.launch {
locationFlow.collect { location ->
println("Received location update: $location")
}
}

// شبیه‌سازی رویدادهای به‌روزرسانی مکان
locationManager.simulateLocationUpdate(Location(51.5074, 0.1278))
locationManager.simulateLocationUpdate(Location(40.7128, -74.0060))

// منتظر ماندن برای مشاهده خروجی
delay(1000)

// لغو شبیه‌سازی و شبیه‌سازی رویداد دیگر
job.cancel()
locationManager.simulateLocationUpdate(Location(34.0522, -118.2437))
}

خروجی:

Received location update: Location(latitude=51.5074, longitude=0.1278) Received location update: Location(latitude=40.7128, longitude=-74.006)

در این مثال، getLocationFlow یک فلو از مکان‌ها ایجاد می‌کند که به صورت یک CallBack از LocationManager استفاده می‌کند. سپس با استفاده از locationFlow.collect، ما این فلو را مصرف می‌کنیم و مکان‌هایی که از LocationManager دریافت می‌شود را چاپ می‌کنیم. simulateLocationUpdate توسط LocationManager برای شبیه‌سازی رویدادهای به روزرسانی مکان فراخوانی می‌شود.

flow
Android Developer
شاید از این پست‌ها خوشتان بیاید