آشنایی با LiveData


یکی از مهم‌ترین Component‌هایی که گوگل در سال 2017 معرفی نمود، LiveData بود.

چرا گوگل LiveData را معرفی کرد؟

زمانی را در نظر بگیرید که قبل از LiveData مجبور بودید نتیجه یک عمل در Background Thread را به UI Thread ارسال کنید. خب چه کاری انجام می‌دادید؟ شما باید از کامپوننت‌های Interface یا EventBus استفاده می‌کردید که هر کدام از آن‌ها پیچیدگی‌ها و سختی‌های خاص خود را داشتند.

کامپوننت LiveData چیست؟

با توجه به تعریف مستندات گوگل، LiveData تنها یک نوع Observable است، اما LiveData یک تفاوت با سایر Observable‌ها دارد. LiveData از LifeCycle آگاه است (LifeCycle-Aware). این موضوع مشکل کرش شدن اپ را در هنگام تغییر LifeCycle حل می‌کند. این آگاهی موجب می‌شود که LiveData تنها زمانی آپدیت شود که LifeCycle در یکی از حالت‌های فعال باشد (Started, Created, Resumed)



خب LiveData چطور کار می کند؟

برای درک بهتر LiveData باید اول به سراغ مفهوم "Observer Pattern" برویم. Observer Pattern یک الگوی برنامه‌‌نویسی است که در آن یک شی، 1 یا چند وابسته دارد. Observers در صورت اعمال تغییرات در محتوای شی یعنی Observable از تغییرات ایجاد شده آگاهی پیدا می‌کند. این الگو از دو عنوان اصلی تشکیل شده است:

  • Observer
  • Observable

برای درک بهتر این موضوع به سراغ یک مثال از دنیای واقعی می‌رویم:

به طور مثال فرض کنید که در یک فروشگاه نفری را مامور نظارت بر قفسه مواد شوینده کرده‌اند. وظیفه این فرد گزارش کم شدن تعداد اقلام داخل قفسه است. در این مثال فرد مسئول همان Observer یا نظاره گر است. قفسه که اطلاعات در آن ذخیره شده و مرتبا تغییر می‌کند همان Observable یا آبجکتی است که بر روی محتوای آن نظارت داریم.

بزرگ‌ترین مشکل کلاس LiveData تغییر نکردن مقادیر آن است. بنابراین گوگل برای حل این مشکل، دو کلاس را برای استفاده از LiveData معرفی کرده است که در این قسمت با آن‌ها آشنا می‌شویم.



1- کلاس MutableLiveData

کلاس MutableLiveData از کلاس LiveData مشتق (Extend) شده است. دو متد عمومی در این کلاس  برای تغییر محتوا وجود دارند.

  • متد setValue: شما می‌توانید با استفاده از این متد مقداری را به شئ اضافه کنید. البته به این نکته توجه داشته باشید که این روش فقط باید در داخل Main Thread یا همان UI Thread انجام شود.
  • متد postValue: این متد دقیقا همان کارکرد setValue را دارد. اما این روش Thread Safe است و در Background Thread نیز اجرا می‌شود.


2- کلاس MediatorLiveData

این کلاس از MutableLiveData مشتق شده است و دو متد بالا نیز در آن وجود دارند. کلاس MediatorLiveData دارای یک قابلیت بسیار خوب دیگر نیز است. این کلاس می‌تواند یک یا چند LiveData را برای تغییر زیر نظر بگیرد و بر اساس تغییر در آن متغیرها واکنش نشان دهد.

این کلاس می‌تواند یک یا چند LiveData را برای تغییر زیر نظر بگیرد و بر اساس تغییر در آن متغیرها واکنش نشان دهد.


متد removeSource: این متد برای اتمام عمل نظارت بر روی LiveData مورد نظر استفاده می‌شود.



نصب و استفاده


شرایطی را در نظر بگیرید که دو Fragment در یک Activity دارید.  یکی از Fragment‌ها شامل لیست محصولات و در دیگری نوع مرتب‌سازی لیست قرار دارد و هر دو همزمان در صفحه، نمایش داده می‌شوند.

شما می‌توانید با تعریف یک متغیر از نوع LiveData برای نوع مرتب‌سازی در FragmentA و Observe کردن آن متغیر در FragmentB به راحتی این مسئله را حل کنید.

فرگمنت اول که دارای یک دکمه برای تغییر ترتیب نمایش است
فرگمنت اول که دارای یک دکمه برای تغییر ترتیب نمایش است


فرگمنت دوم که از فرگمنت اول observe می‌کند
فرگمنت دوم که از فرگمنت اول observe می‌کند


در مطلب بعدی به این موضوع نگاه عمیق‌تری می‌کنیم و ادغام LiveData با RxJava و Room را توضیح می‌دهیم.