علیرضا احمدی
علیرضا احمدی
خواندن ۴ دقیقه·۵ سال پیش

ساز و کار RX و پترن observer در اندروید

به نام خدا

سلام دوستان. امیدوارم که حال کد هاتون خوب باشه...

خوب یک راست بریم سر اصل مطلب. چرا RX آمد و ساز و کار این ویژگی چیه؟



ببینید دوستان فرقی نمیکنه شما جاوا کار میکنید یا کاتلین یا حتی php و سی شارپ و... چون برنامه نویسی به سبک RX یه ویژگی هست که داخل همه این زبان ها گنجانده شده و شما میتونید از پکیج های مختلفی نظیر RXKotlin ، RXJava و... برای زبان های مختلف استفاده کنید. اما این کتابخونه ها یا این ساز و کار در زبان های برنامه نویسی چه کاری انجام میدن؟

یه مثال براتون میزنم و در این مثال هم فرض رو بر این میگیرم که شما اندروید کار کردین :

فرض کنید یه دیتا کلاس دارید به نام Person که یه فیلد name داره و یه فیلد family . حالا شما داخل اکتیویتی میاید همین دیتا کلاس رو مقدار دهی میکنید و از همین دیتا کلاس هم برای پر کردن دو تا تکست ویو استفاده میکنید. مثل کد زیر :

خوب تا اینجا Alireza Ahmadi به کاربر نمایش داده خواهد شد. اما حالا اگر من داخل رویداد کلیک یک Button بیام مقادیر این نمونه ساخته شده از کلاس Person رو تغییر بدم، آیا view یا همون xml من هم متوجه این تغییر میشه؟ جواب خیر میباشد ههههه. چرا؟ چون من اگر بخوام view هم متوجه این تغییر بشه باید بیام بعد از تغییر دادن نمونه، دوباره name و family رو به text view های خودم پاس بدم تا view هم تغییر کنه مثل کد زیر :

اما RX با استفاده از پترن observer این مشکلات رو حل میکنه. اما برای درک عمیق تر این مبحث بزارید یکم راجب پترن observer براتون بنویسم. این پترن میگه در چنین مواقعی ما نیاز به یک مشاهده شونده و یک مشاهده کننده داریم؛ یعنی چی؟ یعنی کلاسی که داده هارو داره فراهم میکنه، باید از نوع مشاهده شونده در نظر بگیریم و اونایی که قراره این داده ها رو دریافت کنن از نوع مشاهده کننده. خوب این یعنی چی؟ یعنی اینکه ما کلاس Person رو از نوع مشاهده شونده در نظر بگیریم که قراره اکتیویتی ما به اون نگاه کنه که هر موقع داده های اون تغییر کرد، اکتیویتی هم بیاد داده های جدید رو به تکست ویو ها پاس بده؛ بدین صورت که اگر قراره ما name و family رو پاس بدیم به تکست ویو ، بیایم این کار رو داخل یک تابع بنویسیم و این تابع رو هم به مشاهده شونده یا همون کلاس Person خودمون معرفی کنیم و بگیم هر وقت که مقادیر name و family تو تغییر کرد، این تابع رو صدا بزن تا text تکست ویو های ما هم تغییر کنه.

برای درک کامل پترن observer به لینک زیر مراجعه کرده و چگونگی پیاده سازی این پترن رو مشاهده کنید:

https://github.com/alirezaahmadi056/kotlin-design-patterns



و اما آر ایکس :

در کتابخونه RX چند تا مفهوم بزرگ وجود داره که کلا میشه گفت ساز و کار آر ایکس رو مشخص میکنه :

  • مشاهده شونده یا observable
  • مشاهده کننده یا observer
  • مشترک شدن یا Subscribe
  • آزاد کننده منابع از دست دادنی یا disposable

خوب مشاهده شونده که همون منبع یا کلاسی هست که داده هارو انتشار میده و مشاهده کننده هم اون کلاس هایی هستن که خودشون رو به مشاهده شونده معرفی میکنن و بلافاصله بعد از انتشار داده توسط مشاهده شونده، این مشاهده کننده ها با خبر میشن و هر کار دوست داشته باشن انجام میدن. اما چطور یک مشاهده کننده خودشو به مشاهده شونده معرفی میکنه؟ با استفاده از Subscribe یا همون مشترک شدن؛ پس هر مشاهده کننده باید برای دریافت داده از سمت مشاهده شونده، به مشاهده شونده subscribe کنه یا به عبارتی مشترک بشه.

حالا شما فرض کنید یک مشاهده کننده به یک مشاهده شونده متصل هست و داره اطلاعات رو دریافت میکنه که یهو گوشی زنگ میخوره؛ در اینجا اگر داده ها آزاد یا free نشن، برنامه تون کرش میکنه؛ پس disposable هم میشه آزاد سازی داده ها در شرایط خاص که تمام این کارها رو خود آر ایکس برای ما انجام میده و ما فقط باید متد ها و توابع رو فراخونی کنیم.



یکی دیگه از قابلیت های مهم و اساسی RX اینه که ما میتونیم دریافت اطلاعات رو به صورت ناهمزمان انجام بدیم و در واقع گرفتن اطلاعات از سرور که کاری زمان بر هست رو میتونیم به یک thread دیگه محول کنیم که حالا به مباحث thread و برنامه نویسی همزمان و ناهمزمان و اینکه چرا نام این دو روش ( همزمان و ناهمزمان ) جابه جا شده، در مقاله بعدی به صورت کامل میپردازیم.

یه سوال هم پیش میاد که چرا باید در کنار RXJava یا حالا RXKotlin از RXAndroid هم استفاده کنیم. ببینید دوستان، RXAndroid چند تا متد داره که مخصوص اندروید هست و در مواقعی ما به این متد ها نیاز داریم؛ به عنوان مثال شما میاین با استفاده از متد های RXJava مشخص میکنید که گرفتن اطلاعات از سرور در thread بک گراند اتفاق بیوفته؛ اما زمانی که داده ها گرفته شد میخواین برگردین به thread اصلی یا main تا بتونید از کد های اندروید نظیر toast استفاده کنید ( اگر در thread بکگراند از toast استفاده کنید برنامه کرش میکنه چون کد اندروید جاش توی بکگراند نیست و باید در thread اصلی یا همون ui thread استفاده بشه ) پس برای این کار و برگشتن به thread اصلی شما باید از متد RXAndroid استفاده کنی چون java و kotlin که thread اصلی رو نمیشناسن و UI thread براشون معنی نداره دیگه...

خوب تا مقاله بعدی خدا یار و نگهدارتون باشه.

به امید روزای بهتر...

rxjavarxkotlinrxandroidobserverobservable
مدیر تولید محتوای وبسایت آموزشگام
شاید از این پست‌ها خوشتان بیاید