Ali Shobeyri
Ali Shobeyri
خواندن ۳ دقیقه·۴ سال پیش

بررسی Kotlin Flow به زبان ساده

فلویی از داده ها ، مثلا در اینجا آب
فلویی از داده ها ، مثلا در اینجا آب

آیا تا حالا با RxJava کار کردید ؟ با Sequences چطور ؟ امروز با مبحثی آشنا می‌شیم که می‌تونه جایگزینی برای استفاده از این ابزار باشه . در این مقاله با به طور ساده این مبحث رو با هم بررسی می‌کنیم .

برنامه نویسی Reactive

قبل از هر چیز باید بدونیم برنامه نویسی Reactive چیه ؟ به طور خلاصه کاری که RxJava یا RxAndroid یا RxKotlin یا ... انجام میدن پیاده سازی این نوع برنامه نویسی برای محیط جاوا/کاتلین/اندروید هستند . در برنامه نویسی Reactive یا "واکنش گرا" ما با استریمی از داده ها ، event ها و callback ها کار داریم .

کاتلین Flow

در واقع Flow همون طور که از اسمش هم پیداست sequence ای از داده ها به صورت آسنکرون هست . Flow اگر با Coroutines تکریب شود Coroutines را به عنوان scheduler (برای بردن روی Thread های مختلف) اتخاذ می‌‎کند . Flow به طور کامل Coroutines رو ساپورت می‌کنه و در کنار هم ابزار قدرتمندی برای توسعه اپلیکیشن ها محسوب می‌شوند .

مدل Flow
مدل Flow

به تصویر بالا توجه کنید ، تابع getValues برای ما مقادیری از جنس Flow رو emit می‌کنه و تابع processValues که این Flow رو دنبال یا Subscribe می‌کنه مقادیر emit شده رو می‌گیره و پردازش مورد نظر خودش رو انجام میده .

مزایای Flow

  • بسیار ساده تره نسبت به Rx
  • منطبق با Coroutines (مثلا وقتی Coroutines کنسل بشه Flow هم کنسل میشه)
  • ویژگی Backpressure Handling (البته در Rx هم وجود داره ، وقتی Emitter با سرعت زیادی تری نسبت به Collector دیتا رو منتشر می‌کنه مشکلی برای ما پیش نمیاد ، Emit ها در یک صف قرار داده میشن و به ترتیب به Collector پاس داده میشن)
  • ویژگی Suspending (اگر با Coroutines آشنا باشید متوجه می‌شوید که چون به صورت آسنکرون انجام میشه در واقع Thread اصلی شما block نمیشه)

مثال هایی از Flow

ابتدا باید کتابخونه Coroutines رو به پروژه اضافه کنید

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1'


https://gist.github.com/sasssass/3742f19315c7e7e3bf1f2c2c2b56d33a

و نتیجه :

حالا یک مثال جامع تر رو بررسی خواهیم کرد ، فرض کنید مدل دیتایی داریم که شامل لیستی از User ها است ، ما می‌خواهیم اسامی این User ها رو در صفحه ای خاص داشته باشیم ، در این سناریو دو بار لیستی از User ها emit می‌شود با فاصله زمانی 2 ثانیه و سپس یک ارور 403 قرار است داده شود .

ما یک DataSource خواهیم داشت که وظیفه این عمل رو به عهده می‌گیره ، این کلاس وظیفه اتصال به Api رو دارد (که اینجا البته نیست و صرفا یک لیستی پاس می‌دهیم) ، سپس در Repo دیتا process شده و تبدیل به لیستی از اسامی می‌شود ، سپس در UI نمایش داده می‌شود (مسلما یک پیاده سازی ساده است ، بعد از خواندن این مقاله سعی کنید Flow رو با MVVM یا دیگر معماری هایی که استفاده می‌کنید مثل Clean MVVM یا MVI ترکیب کنید ) :

https://gist.github.com/sasssass/cdc722f5a55c94ccbe8737b6ed0add76

و خروجی :

شما می‌تواند Flow را به جای LiveData یا Rx با Room هم ترکیب کنید :

البته Flow به همینجا ختم نمی‌شود و ویژگی های بسیاری دارد که سعی می‌کنم در آینده در مورد اونها با هم صحبت کنیم .

اگر از مقالات من راضی هستید لطفا به LinkedIn من برید و من Skill های مرتبط با اندروید من رو یک پلاس روش بزنید :)


آدرس کانال تلگرامی ما : لینک

لینک گیت مقاله رو هم در این لینک می‌تونید ببینید .

من رو در لینکدین ، اینستاگرام و یوتیوب دنبال کنید !!!

اگه دوست داشتید می‌تونید به صفحه Spotify و SoundCloud بنده هم برید و موسیقی های منو گوش بدید !!!


اندرویدکاتلینkotlinandroidبرنامه نویسی
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید