آموزش استفاده از Shared Flow در اندروید
Shared Flow یک جریان “hot” است که مقادیر ارسال شده را بین تمام مصرفکنندگانش به صورت یکسان پخش میکند. این نوع از جریان به علت وجود فعالیت مستقل از حضور مصرفکنندگان “hot” نامیده میشود.
“ما را در اینستاگرام دنبال کنید”
در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد Shared Flow در اندروید ، صحبت کنیم. پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”
توی دوره ژنرال صفر تا صد زبان Shared Flow در اندروید رو در فصل Flow کامل توضیح دادیم و همچنین توی پروژه های دیجی کالا و اسنپ فود به صورت عملی و پروژه محور از Shared Flow استفاده کردیم و بطور کامل اون رو آموزش دادیم.
در این مقاله، با Shared Flow در کتابخانه kotlinx.coroutines در Kotlin آشنا خواهیم شد. SharedFlow یک hot flow است که مقادیر ارسال شده را بین تمام مصرفکنندگانش به صورت پخش میکند. این نوع از جریان به علت وجود فعالیت مستقل از حضور مصرفکنندگان “گرم” نامیده میشود. در این مقاله، ما با نحوه استفاده از SharedFlow و مفاهیم مهم مرتبط با آن آشنا خواهیم شد.
Shared Flow چیست؟
Shared Flow یک نوع جریان است که مقادیر ارسال شده را به صورت یکسان پخش میکند، به این معنا که همه مصرفکنندگان همه مقادیر ارسال شده را دریافت میکنند.
این نوع از جریان به علت وجود فعالیت مستقل از حضور مصرفکنندگان “hot” نامیده میشود. برخلاف یک flow معمولی (مانند آنچه توسط تابع flow { … } تعریف میشود) که “cold” است و برای هر مصرفکننده به صورت مجزا شروع میشود.
یک SharedFlow هرگز به اتمام نمیرسد. فراخوانی Flow.collect بر روی یک SharedFlow به طور معمول به صورت نرمال به پایان نمیرسد، و همچنین یک coroutine که توسط تابع Flow.launchIn شروع میشود نیز هیچگاه به پایان نمیرسد.
یک مصرفکننده فعال از یک SharedFlow یک “اشتراکگذارنده” نامیده میشود.
یک مصرفکننده از یک SharedFlow میتواند لغو شود. این اتفاق معمولاً زمانی رخ میدهد که دامنهای که coroutine در آن اجرا میشود، لغو میشود.
یک مشترک در یک SharedFlow همیشه قابل لغو است و قبل از هر ارسال، بررسی میکند که آیا لغو شده است یا خیر.
در واقع SharedFlow یک hot flow است که میتواند دارای چندین مصرفکننده باشد. میتواند مقادیر را بهطور مستقل از مصرفکنندگان منتشر کند و چندین مصرفکننده میتوانند همان مقادیر را از جریان دریافت کنند.
این در مواقعی مفید است که نیاز به پخش یک مقدار به چندین مصرفکننده داشته باشید یا میخواهید چندین مشترک برای همان جریان اطلاعات داشته باشید.
این جریان مقدار اولیه ندارد و میتوانید حافظه پنهان بازیابی را تنظیم کنید تا تعداد معینی از مقادیر ارسال شده پیشین برای مصرفکنندگان جدید ذخیره شود.
یک توضیح کامل در مورد MutableSharedFlow در کاتلین
MutableSharedFlow یک نوع از Flow در کاتلین است که اجازه میدهد دادهها را تولید کنید و در چندین مکان مصرف کنید. این به توسعهدهندگان امکان میدهد که دادهها را بهروز کنند و به اشتراک بگذارند، حتی در زمان اجرا.
ویژگیهای کلیدی MutableSharedFlow
-
تولید داده (Emit)
شما میتوانید دادهها را با استفاده از `emit` ارسال کنید. به عبارت دیگر، شما میتوانید دادههای جدید را به MutableSharedFlow اضافه کنید.
-
مصرف کنندههای چندگانه (Multiple Consumers)
برخلاف بسیاری از نوعهای دیگر Flow، شما میتوانید چندین مصرفکننده داشته باشید. هر کدام از آنها میتوانند دادهها را بهصورت همزمان مصرف کنند.
-
استفاده در توابع Suspending و Non-Suspending
شما میتوانید MutableSharedFlow را در توابع Suspending و Non-Suspending استفاده کنید. این به شما اجازه میدهد که از آن در کدهای همزمان و غیرهمزمان استفاده کنید.
-
مدیریت خطاها
شما میتوانید خطاها و استثناءها را در MutableSharedFlow مدیریت کنید و به مصرفکنندگان ارسال کنید.
-
بازههای زمانی (Buffering)
شما میتوانید بازههای زمانی برای MutableSharedFlow تعیین کنید تا دادهها را در آن مدت نگهداری کند و به مصرفکنندگان ارسال کند.
-
بدون تاخیر در شروع (Replay)
MutableSharedFlow میتواند دادههای موجود را به مصرفکنندگان جدید ارسال کند، حتی اگر آنها بعد از شروع فرآیند ارسال و دریافت آن به برنامه بپیوندند.
کلیدیترین نکته در استفاده از MutableSharedFlow این است که باید مواظبت کنید که همواره یک منبع معتبر داده در اختیار داشته باشید تا دادههای صحیح و قابل اطمینان ارسال شوند.
با ارائه مثالی با زبان کاتلین سعی میکنم Shared Flow را بهتر برایتان توضیح دهم:
حساب کردن میانگین یک لیست از اعداد با استفاده از Shared Flow به شکل زیر میتواند یک مثال خوب باشد:
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking fun main() = runBlocking { // ایجاد یک Shared Flow برای ذخیره اعداد val numbersFlow = MutableSharedFlow<Int>() // تعریف یک اپراتور برای محاسبه میانگین fun calculateAverage(numbers: List<Int>): Double { return if (numbers.isNotEmpty()) { numbers.sum().toDouble() / numbers.size } else { 0.0 } } // افزودن اعداد به Shared Flow launch { for (i in 1..10) { numbersFlow.emit(i) } numbersFlow.emit(20) } // جمعآوری اعداد و محاسبه میانگین val numbersList = mutableListOf<Int>() val averageFlow = numbersFlow.asSharedFlow() launch { averageFlow.collect { number -> numbersList.add(number) val average = calculateAverage(numbersList) println("میانگین تا کنون: $average") } } }
فرض کنید میخواهیم یک برنامه ثبت نام کاربران بسازیم. در این برنامه، کاربر میبایست نام و نام خانوادگی خود را وارد کند. از Shared Flow برای مدیریت و انتقال این اطلاعات میان صفحات استفاده میکنیم.
در اینجا نمونهای از کار با Shared Flow در کاتلین به شکل زیر است:
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking data class User(val firstName: String, val lastName: String) val userFlow = MutableSharedFlow<User>() fun main() = runBlocking { val registrationJob = launch { val user = User("John", "Doe") userFlow.emit(user) } val displayJob = launch { userFlow.collect { user -> println("نام: ${user.firstName}, نام خانوادگی: ${user.lastName}") } } registrationJob.join() displayJob.join() }
در این مثال، یک User
تعریف میشود که شامل دو فیلد نام و نام خانوادگی است. یک MutableSharedFlow
به نام userFlow
ایجاد میشود که میتوانیم اطلاعات کاربر را در آن ارسال کنیم.
سپس دو وظیفه ایجاد میشود:
registrationJob
: این وظیفه یک کاربر با نام “John” و نام خانوادگی “Doe” را بهuserFlow
ارسال میکند.displayJob
: این وظیفه اطلاعات کاربر را ازuserFlow
دریافت و نمایش میدهد.
با اجرای این کد، نتیجه خواهیم داشت:
نام: John, نام خانوادگی: Doe
این نمونه نشان میدهد که چگونه از Shared Flow میتوان برای ارسال و دریافت دادهها در بین مختلف قسمتهای برنامه استفاده کرد.
حرف آخر
در این مقاله ، ما به تفصیل در مورد Shared Flow در کاتلین صحبت کردیم. SharedFlow یک hot flow است که مقدارهای منتشر شده را به همه مصرفکنندگانش به صورت یکسان پخش میکند.
این امکان را فراهم میکند که همه مصرفکنندگان همه ارزشهای منتشر شده را دریافت کنند. ما نیز در مورد نکات مهمی مانند حافظه نهان و بوفر برای افزایش کارایی و کنترل دریافت اطلاعات توضیح دادیم.
و همچنین ممنون میشم از طریق ستارههای این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.
دیدگاهتان را بنویسید