مقالات

مقایسه Shared Flow و State Flow در اندروید

مقایسه Shared Flow و State Flow: برای مدیریت وضعیت‌ها و ارسال داده‌ها در اندروید، از State Flow و Shared Flow می‌توانید استفاده کنید. انتخاب بین این دو بستگی به نیاز‌های خاص پروژه و نوع اطلاعاتی دارد که می‌خواهید مدیریت کنید. State Flow بیشتر برای مواردی استفاده می‌شود که نیاز به نگهداری وضعیت‌ها و تغییرات مکرر دارید، در حالی که Shared Flow بیشتر برای ارسال رویدادها یا داده‌های یکبار مصرف استفاده می‌شود.

 

“ما را در اینستاگرام دنبال کنید”

در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد مقایسه Shared Flow و State Flow در اندروید ، صحبت کنیم. پس با سایت ترولرن همراه باش.

“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”

توی دوره ژنرال صفر تا صد زبان Shared Flow و State Flow در اندروید رو در فصل Flow کامل توضیح دادیم و همچنین توی پروژه های دیجی کالا و اسنپ فود به صورت عملی و پروژه محور از Shared Flow و State Flow استفاده کردیم و بطور کامل اون رو آموزش دادیم.

مقایسه Shared Flow و State Flow

در اندروید و برنامه نویسی با استفاده از کاتلین و کروتینز، State Flow و Shared Flow دو رویکرد مختلف برای مدیریت جریان داده‌ها هستند.

 State Flow

State Flow یک جریان داده است که مقدار آن می‌تواند تغییر کند و مانند یک متغیر mutable در Kotlin عمل می‌کند. اما مهمترین تفاوت آن با متغیر‌های معمولی این است که می‌توانید به State Flow به عنوان یک فلو نظارت کنید و هر بار که مقدار آن تغییر می‌کند، اطلاعات جدید را به شنونده‌ها (observers) ارسال می‌کند.

 استفاده از State Flow در ViewModel

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

Shared 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

1. مدیریت وضعیت‌ها در ViewModel:

State Flow برای نگهداری وضعیت‌ها در ViewModel بسیار مفید است. وقتی که وضعیت یک بخش از برنامه تغییر می‌کند و تمام شنوندگان نیاز به دریافت تغییرات هستند.

مثال:

class MyViewModel : ViewModel() {
private val _currentState = MutableStateFlow(0)
val currentState: StateFlow<Int> get() = _currentState

fun updateState(newValue: Int) {
_currentState.value = newValue
}
}

2. نمایش داده‌های فراهم شده توسط دیتابیس یا شبکه:

وقتی که اطلاعات از دیتابیس یا سرویس شبکه دریافت می‌شوند و می‌خواهید آن‌ها را به 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

1. رویدادها یا اطلاعاتی که نیاز به ارسال یکبار به تمام مشترک‌ها دارند:

Shared Flow برای ارسال رویدادها یا اطلاعاتی که نیاز به یک بار ارسال به همه مشترک‌ها دارند، بسیار مناسب است.

مثال:

class EventRepository {
private val _events = MutableSharedFlow<Event>()
val events: SharedFlow<Event> get() = _events

suspend fun emitEvent(event: Event) {
_events.emit(event)
}
}

2.مدیریت وضعیت‌ها با زمانبندی خاص:

در صورتی که نیاز به مدیریت وضعیت‌ها با یک زمانبندی خاص (مثلا هر چند ثانیه یکبار) دارید، از 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

توضیح کلی

 StateFlow یک نوع خاص از Flow است که یک داده را نگهداری می‌کند و آن را به تمام مشترکین خود منتشر می‌کند.
هنگامی که داده تغییر می‌کند، تمام مشترکین به صورت خودکار از تغییر مطلع می‌شوند.

کاربردها

 وقتی که نیاز به نگهداری و پیگیری وضعیت فعلی دارید (مانند وضعیت یک UI در اپلیکیشن اندروید).
زمانی که تمام مشترکین باید وضعیت فعلی را بدانند و هر بار که تغییری رخ می‌دهد از آن مطلع شوند.

 SharedFlow

توضیح کلی

 SharedFlow همچنین یک نوع خاص از Flow است، اما برخلاف StateFlow، داده فعلی را نگه نمی‌دارد. به عبارت دیگر، فقط آخرین داده را به مشترکین ارسال می‌کند.
مزیت این نوع Flow این است که مشترکین به داده‌هایی که زمان اشتراک گذاری شدند نیاز دارند و بقیه تاریخچه داده‌ها برایشان مهم نیست.

کاربردها

وقتی که برنامه نیاز به اطلاع رسانی فوری در مورد وقوع یک حالت خاص دارد (مثلاً اعلان‌ها یا رویدادهای فوری).
در مواردی که تاریخچه داده‌ها برای مشترکین مهم نیست و فقط آخرین داده مهم است.

مثال

برای مثال، وقتی که شما در یک اپلیکیشن اندروید با یک دکمه‌ی “شارژ” روبرو هستید، اگر می‌خواهید وضعیت شارژ را به کاربر نشان دهید و هر بار که شارژ تغییر کند او را مطلع کنید، از StateFlow استفاده می‌کنید. اما اگر نیاز دارید تا تنها وضعیت شارژ فعلی را نمایش دهید و بیشتر از این مورد اهمیت ندارد، از SharedFlow استفاده می‌کنید.

 خلاصه

 اگر نیاز به نگهداری و انتقال وضعیت فعلی دارید و تغییرات در این وضعیت مهم هستند، از StateFlow استفاده کنید.
اگر نیاز به ارسال رویدادهای فوری دارید و تاریخچه داده‌ها برای مشترکین مهم نیست، از SharedFlow استفاده کنید.

با استفاده از این دو نوع Flow، شما می‌توانید بهترین راهکار را بر اساس نیازهای خاص پروژه‌ی خود انتخاب کنید.

 

‫5/5 ‫(1 نظر)
عاطفه امیری

Recent Posts

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید: راهنمای جامع و کاربردی

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید یکی از مهم‌ترین فاکتورهایی است که برای کاربران در دنیای امروز…

4 ماه ago

سوالات مصاحبه‌ی استخدامی کاتلین همراه با جواب(قسمت چهارم)

مصاحبه‌ی استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

4 ماه ago

سوالات مصاحبه استخدام زبان کاتلین همراه با جواب(قسمت سوم)

مصاحبه استخدام زبان کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه…

4 ماه ago

سوالات مصاحبه استخدام کاتلین همراه با جواب(قسمت دوم)

مصاحبه استخدام کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

سوالات مصاحبه استخدامی کاتلین همراه با جواب(قسمت اول)

مصاحبه استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

نوتیفیکیشن در اندروید: نحوه کار با آن در کاتلین

نوتیفیکیشن در اندروید امروزه یکی از قابلیت‌های مهم و پرکاربرد در اپلیکیشن‌های اندروید هستند. با…

5 ماه ago