این سری نوشته ها خلاصه کتاب اموزشی به نام Android Programming: The Big Nerd Ranch Guide که سعی خواهم کرد در حال مطالعه کتاب نکات خلاصه و مفید رو بنویسم
Viewmodel :
بطور معمول کاربرها انتظار دارند پس از چرخش صفحه موبایل یا مخفی شدن اکتیویتی و کلا حالت های چهارگانه چرخه حیات ، برنامه دوباره به همان وضعیت قبل برگردد ، اما پیاده سازی کامل چنین کاری در اکتیویتی ها پر هزینه خواهد بود . Viewmodel برای رفع همین مشکل ساخته شده ، یعنی جدا سازی منطق برنامه از اکتیویتی ، بطوری که وقتی اکتیویتی در چرخه حیات خود در وضعیت های مختلف قرار بگیرد ، Viewmodel همچنان در حافظه باقی است و هر وقت اکتیویتی دوباره سازی شود ، از همان Viewmodel استفاده کرده و اخرین اطلاعات قبل از وضعیت ترک اپلیکیشن به کاربر نمایش داده خواهد شد
کار اصلی Viewmodel تزئین اطلاعات model یا همان منطق برنامه برای نمایش در اکتیویتی است .اولین قدم برای استفاده از Viewmodel قبل از هر چیز افزودن dependence به build.gradle :
Impementation 'androidx.lifecycle:lifecycle-extensions:+latest-version'
حالا باید با استفاده از ViewModelProviders که وظیفه تامین Viewmodel را برای اکتیویتی بر عهده دارد ، یک نمونه ساخته و در کل اکتیویتی استفاده کنیم :
class MainActivity : AppCompatActivity() { ... private val quizViewModel: QuizViewModel by lazy { ViewModelProviders.of(this).get(QuizViewModel::class.java) } override fun onCreate(savedInstanceState: Bundle?) {}
با استفاده از lazy میتوان یکبار ViewModelProviders را تعریف کرده و بصورت val از ان در اکتیویتی استفاده کرد و همچنین تضمین خواهد کرد Viewmodel دقیقا یکبار تعریف و پیاده سازی شود ، همچنین اجازه استفاده از Viewmodel را قبل از Activity.onCreate(…) خواهد گرفت
همانطور که در logcat برنامه میبینید یکبار فقط Viewmodel ساخته شده و در هر وضعیت اکتیویتی به هیچ وجه از بین نمیرود ، تا زمانی مثل logcat زیر اکتیویتی نیز destroy شود ، در اینصورت Viewmodel نیز از بین خواهد رفت
نکته مهم :
در حال حاضر نحوه intialize کردن Viewmodel در اکتویتی به صورتی که در بالا با استفاده از ViewModelProviders گفته شد دیگر deprecated شده و بهتر برای اینکار ابتدا dependence زیر اضافه کنیم :
implementation 'androidx.activity:activity-ktx:last-version'
بعد بصورت زیر Viewmodel را تعریف کنید :
private val myViewmodel: MyViewmodel by viewModels()