“ما را در اینستاگرام دنبال کنید”
در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد مقایسه Shared Flow و State Flow در اندروید ، صحبت کنیم. پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”
توی دوره ژنرال صفر تا صد زبان Shared Flow و State Flow در اندروید رو در فصل Flow کامل توضیح دادیم و همچنین توی پروژه های دیجی کالا و اسنپ فود به صورت عملی و پروژه محور از Shared Flow و State Flow استفاده کردیم و بطور کامل اون رو آموزش دادیم.
در اندروید و برنامه نویسی با استفاده از کاتلین و کروتینز، State Flow و Shared Flow دو رویکرد مختلف برای مدیریت جریان دادهها هستند.
State Flow یک جریان داده است که مقدار آن میتواند تغییر کند و مانند یک متغیر mutable در Kotlin عمل میکند. اما مهمترین تفاوت آن با متغیرهای معمولی این است که میتوانید به State Flow به عنوان یک فلو نظارت کنید و هر بار که مقدار آن تغییر میکند، اطلاعات جدید را به شنوندهها (observers) ارسال میکند.
class MyViewModel: ViewModel() { private val _currentState = MutableStateFlow(0) // مقدار اولیه 0 val currentState: StateFlow<Int> get() = _currentState fun updateState(newValue: Int) { _currentState.value = newValue } }
در این مثال، یک ViewModel ایجاد شده است که یک State Flow از نوع Integer دارد. هر بار که `updateState` فراخوانی میشود، مقدار State Flow تغییر میکند و این تغییر به تمام شنوندگان منتقل میشود.
Shared Flow همچنین یک جریان داده است اما با تفاوت اساسی که این جریان مقدارش برای هر مشترک یکبار و بر اساس یک استراتژی خاص ارسال میشود. این بدان معنی است که اگر چندین مشترک داشته باشید، هرکدام از آنها میتوانند مقدار جدید را دریافت کنند.
class MyRepository { private val _events = MutableSharedFlow<String>(replay = 1) // replay = 1 به معنی ارسال آخرین مقدار به مشترکهای جدید است val events: SharedFlow<String> get() = _events suspend fun emitEvent(event: String) { _events.emit(event) } }
در این مثال، یک ریپازیتوری ایجاد شده است که یک Shared Flow از نوع String دارد. وقتی که `emitEvent` فراخوانی میشود، یک مقدار جدید به تمام مشترکها ارسال میشود.
با اینکه هر دو State Flow و Shared Flow برای مدیریت جریان دادهها بسیار مفیدند، اما مواقع مختلفی برای استفاده از آنها وجود دارد. State Flow بیشتر برای مواردی مناسب است که یک مقدار به صورت متغیر تغییر میکند و تمام شنوندگان نیاز به دریافت همه تغییرات دارند. در مقابل، Shared Flow برای مواردی که ممکن است بیش از یک شنونده داشته باشید و هرکدام نیاز به مقادیر منحصر به فرد باشند، مناسب است.
State Flow و Shared Flow هر دو برای مدیریت جریان دادهها در اندروید مناسب هستند، اما مواقع مختلفی برای استفاده از آنها وجود دارد. در زیر، مواردی که هرکدام برای آن مناسب هستند به همراه مثالها آمده است:
State Flow برای نگهداری وضعیتها در ViewModel بسیار مفید است. وقتی که وضعیت یک بخش از برنامه تغییر میکند و تمام شنوندگان نیاز به دریافت تغییرات هستند.
مثال:
class MyViewModel : ViewModel() { private val _currentState = MutableStateFlow(0) val currentState: StateFlow<Int> get() = _currentState fun updateState(newValue: Int) { _currentState.value = newValue } }
وقتی که اطلاعات از دیتابیس یا سرویس شبکه دریافت میشوند و میخواهید آنها را به Activity یا Fragment نمایش دهید، از State Flow میتوانید استفاده کنید.
مثال:
class UserRepository { private val _userData = MutableStateFlow<User?>(null) val userData: StateFlow<User?> get() = _userData suspend fun fetchUserData(userId: String) { val user = fetchUserFromNetwork(userId) _userData.value = user } }
Shared Flow برای ارسال رویدادها یا اطلاعاتی که نیاز به یک بار ارسال به همه مشترکها دارند، بسیار مناسب است.
مثال:
class EventRepository { private val _events = MutableSharedFlow<Event>() val events: SharedFlow<Event> get() = _events suspend fun emitEvent(event: Event) { _events.emit(event) } }
در صورتی که نیاز به مدیریت وضعیتها با یک زمانبندی خاص (مثلا هر چند ثانیه یکبار) دارید، از SharedFlow میتوانید استفاده کنید.
مثال:
class StatusManager { private val _statusUpdates = MutableSharedFlow<Status>() val statusUpdates: SharedFlow<Status> get() = _statusUpdates init { CoroutineScope(Dispatchers.Default).launch { while (true) { delay(5000) // هر 5 ثانیه یکبار _statusUpdates.emit(fetchLatestStatus()) } } } }
در کاتلین، StateFlow و SharedFlow دو نوع مختلف از کتابخانهی Flow هستند که امکان ارتباط بین دادهها و کدها را با استفاده از کوروتینها و اساسهایی از Reactive programming فراهم میکنند. حالا بیایید به تفصیل هر کدام را بررسی کنیم:
StateFlow یک نوع خاص از Flow است که یک داده را نگهداری میکند و آن را به تمام مشترکین خود منتشر میکند.
هنگامی که داده تغییر میکند، تمام مشترکین به صورت خودکار از تغییر مطلع میشوند.
وقتی که نیاز به نگهداری و پیگیری وضعیت فعلی دارید (مانند وضعیت یک UI در اپلیکیشن اندروید).
زمانی که تمام مشترکین باید وضعیت فعلی را بدانند و هر بار که تغییری رخ میدهد از آن مطلع شوند.
SharedFlow همچنین یک نوع خاص از Flow است، اما برخلاف StateFlow، داده فعلی را نگه نمیدارد. به عبارت دیگر، فقط آخرین داده را به مشترکین ارسال میکند.
مزیت این نوع Flow این است که مشترکین به دادههایی که زمان اشتراک گذاری شدند نیاز دارند و بقیه تاریخچه دادهها برایشان مهم نیست.
وقتی که برنامه نیاز به اطلاع رسانی فوری در مورد وقوع یک حالت خاص دارد (مثلاً اعلانها یا رویدادهای فوری).
در مواردی که تاریخچه دادهها برای مشترکین مهم نیست و فقط آخرین داده مهم است.
برای مثال، وقتی که شما در یک اپلیکیشن اندروید با یک دکمهی “شارژ” روبرو هستید، اگر میخواهید وضعیت شارژ را به کاربر نشان دهید و هر بار که شارژ تغییر کند او را مطلع کنید، از StateFlow استفاده میکنید. اما اگر نیاز دارید تا تنها وضعیت شارژ فعلی را نمایش دهید و بیشتر از این مورد اهمیت ندارد، از SharedFlow استفاده میکنید.
اگر نیاز به نگهداری و انتقال وضعیت فعلی دارید و تغییرات در این وضعیت مهم هستند، از StateFlow استفاده کنید.
اگر نیاز به ارسال رویدادهای فوری دارید و تاریخچه دادهها برای مشترکین مهم نیست، از SharedFlow استفاده کنید.
با استفاده از این دو نوع Flow، شما میتوانید بهترین راهکار را بر اساس نیازهای خاص پروژهی خود انتخاب کنید.
دوره آموزشی کاتلین پیشرفته میتواند مهارتهای شما را با بهرهگیری از ابزارها و فناوریهای مدرن…
مزیتهای کاتلین نسبت به سایر زبانهای برنامه نویسی اندروید این است که سایر زبانها، از…
بهینهسازی عملکرد اپلیکیشنهای اندروید یکی از مهمترین فاکتورهایی است که برای کاربران در دنیای امروز…
مصاحبهی استخدامی کاتلین یک فرصت برای ارزیابی مهارتها و تواناییهای یک برنامهنویس در توسعه اپلیکیشنهای…
مصاحبه استخدام زبان کاتلین یک فرصت برای ارزیابی مهارتها و تواناییهای یک برنامهنویس در توسعه…
مصاحبه استخدام کاتلین یک فرصت برای ارزیابی مهارتها و تواناییهای یک برنامهنویس در توسعه اپلیکیشنهای…