تهیه پیش‌فروش دوره «آموزش تکمیلی و پروژه محور Spring Boot» با ۳۵% تخفیف - فقط تا ۱۳ شهریور 

معرفی Android Architecture Components: ViewModel

شنبه ۰۸ اردیبهشت ۹۷ توسط یوسف رضا مختاری

سلام ! امروز میخواهم به بررسی  ViewModel از Android Architecture Components بپردازیم.

ViewModel یک component بسیار مفید است زمانی که شما میخواهید دیتا خود را برای UI (به عنوان مثال Activity یا Fragment) آماده و مدیریت کنید .

بیاید ببینم چگونه از ViewModel ها در پروژه خود استفاده کنیم.

معرفی

بیایید فرض کنیم شما یک Activity دارید . احتمالا شما چندتا کلاس هم برای ذخیره و آماده کردن دیتا UI دارید .(مانند Presenter از MVP یا ViewModel از MVVM).

متاسفانه کاربر می تواند گوشی خود را بچرخاند ಠ_ಠ پس چه اتفاقی خواهد افتاد؟

 Activity شما باید از نو ساخته شود (recreated) هم چنین دارنده یا holder برای دیتا UI شما وجود دارد. این چه مفهومی دارد؟

  • شما باید به یاد داشته باشید که دیتا را به اکتیویتی از نوساخته شده پاس بدهید . درغیر اینصورت شما باید یکبار دیگر باید دیتا را restore کنید. (به عنوان مثال شما باید دوباره با API یا دیتابیس ارتباط برقرار کنید)
  • شما باید از memory leak آگاه باشد که ممکن است دارنده دیتا UI شما عمر بیشتری نسبت به activity شما داشته باشد ( و شما این را نمی خواهید )

چاره همه ی این مشکلات چیست؟ البته که یک  ViewModel.

ViewModel

ViewModel دیتا شما را برای UI ذخیره می کند و از چرخه حیات یا lifecycle آگاه است .

این چه مفهومی داره؟ بیایید به این gif نگاه کنیم:

 

ViewModel

 ViewModel در مقابل یک دارنده (holder) دیتا UI

 

ViewModel میتواند در میان تغییر وضعیت به صورت live باشد .

این بدین معنی است که حتی پس از اینکه activity به خاطر چرخش گوشی نابود (destroyed) و از نو ساخته شود (recreated) , شما هم چنان ViewModel را با همان دیتا دارید.با این حساب:

  • دیگر نیاز نیست نگران lifecycle دارنده یا holder دیتا UI باشید . ViewModel به صورت اتوماتیک با یک factory ایجاد خواهد شد و نیازی نیست که شما آن را ایجاد کنید یا از بین ببرید .
  • دیتا همیشه به روز خواهد بود — شما بعد از چرخش تلفن همان اطلاعاتی که قبلا دریافت کرده اید را میگیرید و شما نیازی ندارید دیتا را به اکتیویتی از نو ساخته شده پاس بدهید یا دوباره آنها را از دیتابیس فراخوانی کنید . اینا همه برای شما انجام شده!!!
  • دیتا منتظر شما خواهند ماند. شما با API ارتباط برقرار کنید و گوشی خود را می چرخانید نتایج قبل از اینکه activity از نو ساخته شود تحویل داده خواهند شد.  شما مطمئن هستید که دیتا در ViewModel ذخیره شده است و شما میتوانید بلافاصله بعد از از نو ساختن activity آن را دریافت کنید.

 

نحوه استفاده از ViewModel

برای استفاده از  ViewModel  شما باید dependency های زیر را به فابل app/build.gradle اضافه کنید

implementation "android.arch.lifecycle:extensions:1.0.0"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0"

از این پس ،  استفاده از ViewModel بسیار ساده است. بیایید به این مثال نگاه کنیم :

public class UsersViewModel extends ViewModel {
 
     private List userList;
 
     public List getUserList() {
        if (userList == null) {
             usersList = loadUsers();
         }
         return userList;
     }
 
     private List loadUsers() {
         // do something to load users
     }
 }

در اینجا ما دیتایی را برای UI داریم. در این مورد ، لیستی از کاربران را داریم که به نحوی از  یک منبع خارجی load می کنیم .

برای داشتن ViewModel ما فقط نیاز داریم به کلاسی که از ViewModel ارث بری(extend) کند و همین! حالا ما قادر هستیم تا از کلاس UserViewModel در activity استفاده کنیم :

public class UsersActivity extends AppCompatActivity {
 
     @Override
     protected void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         UsersViewModel usersViewModel =
             ViewModelProviders.of(this).get(UsersViewModel.class);
 
         showUsers(usersViewModel.getUserList());
     }
 }

برای دریافت ViewModel خود از ()ViewModelProviders.of استفاده می کنیم .

این factory برای ViewModel ها می باشد به همین دلیل ما نیازی به نگرانی در مورد lifecycle یا چرخه حیات ViewModel نداریم .

پس از دریافت UsersViewModel ، می توانیم برای دریافت دیتاها از متد ()usersViewModel.getUserList  استفاده کنیم .

 

ViewModel در مقابل ()onSaveInstanceState

شما  ممکن است یک سوال بپرسید : معمولا از ()onSaveInstanceState برای ذخیره دیتا پس از تغییر وضعیت استفاده می شود؟

پاسخ ساده است :  ViewModel جایگزین ()onSaveInstanceState نیست!

ViewModel  فقط برای activity هایی  که به علت تغییرات جهت گیری ازنو ساخته می شوند استفاده می شود.

علاوه بر این، ()onSaveInstanceState می تواند پس از اینکه activity توسط سیستم kill می شود، زنده بماند (به عنوان مثال، هنگامی که برنامه به پس زمینه می رود و سیستم تصمیم می گیرد تا مقداری از حافظه را آزاد کند)

پس هدف از داشتن هر دو آنها چیست؟ البته، ما می توانیم فقط از  ()onSaveInstanceState استفاده کنیم، متاسفانه معایبی دارد:

  • در ()onSaveInstanceState ما می توانیم فقط مقدار کمی دیتا را ذخیره کنیم .
  • دیتا باید بصورت Parcelable باشند، بنابراین تنظیم و بازگرداندن مقادیر بسیار آسان نیست .

 

بنابراین، چه وقتی ما باید از ()onSaveInstanceState استفاده کنیم؟

  • از ViewModel برای ذخیره اطلاعات حقیقی برای UI استفاده کنید (برای مثال لیست دوستان یک کاربر)
  • استفاده از ()onSaveInstanceState در ذخیره سازی و دریافت اطلاعات ضروری برای مواقعی که activity توسط سیستم kill می شود ( به عنوان مثال گرفتن id کاربر فعلی )

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

اگر activity ما توسط سیستم کشته شود، ما قادر خواهیم بود لیستی از دوستان کاربر را بازیابی کنیم،

زیرا ما  id کاربر را داریم و هنگامی که ما این لیست را دریافت می کنیم، می توانیم آن را در ViewModel ذخیره کنیم و حتی بعد از تغییر جهت گیری صفحه نمایش از آن استفاده کنیم .

 

امیدوارم این مطلب برای شما مفید بوده باشد.

 

 
 
 
 
 
 

کلیدواژه: آموزش برنامه نویسی اندروید آموزش دیتابیس Room Room اندروید Android Architecture Components ViewModel در دیتابیس room

منابع: android.jlelse.eu

دیدگاه ها:
reza esfandiary
۱ سال قبل
reply
بسیار مفید
محمدامین محمدی
۱ سال قبل
reply
خیلی عالی و مفید، اما در متن از تصاویر سایت Medium استفاده کردید و این سایت هم که از سرفلکه مسدود شده بنابراین نیاز به تغییر لوکیشن تصاویر هست :)
یوسف رضا مختاری
۱ سال قبل در پاسخ به محمدامین محمدی
reply
تشکر..این مورد بررسی میشه حتما...
حامد احمدی
۱۱ ماه قبل
reply
من یک مهندس عمرانم، ولی علاقه به همراه دغدغه معاش من رو به اینجا ها کشیده. امیدوارم با کمک آرکادمی و انبوهی از فیلم ها و مطالب آموزشی، و تنها، خودآموخته یک توسعه دهنده بشم! ممنونم از آرکادمی.
ارسال دیدگاه:
برای ارسال دیگاه باید به سیستم وارد شوید و یا ثبت نام کنید. ثبت نام چند لحظه بیشتر زمان شما را نمیگیرد.