الدرس الثاني: شرح ViewModel على الاندرويد

حسنا هذه تدوينة جديدة من سلسة شرح الترسانة android Jetpack و اليوم سنضرب موعدا مع ViewModal و هو سلاح يجب ان تسلح به لتجنب memory Leak لكن اولا دعنا نعرف ما دوره هذا العنصر دوره ادارة البيانات على الوجهات مثل النوافذ و fragement انا واثق انك لم تفهم شيئا لان الامور ستصبح اكثر سهولة بعد هذه الصورة .
View Modal 

✔ مقدمة :
اننا نحن معشر المبرمجين نكره المستخدمين لانهم يتسببون بشكل او باخر في حدوث مشكل بالتطبيق ثم يشتكون من هذه المشاكل و هذا يغضبني 😂 مثال ذلك انه يقوم بشقلبت الهاتف فقط للتجربة فيحدث ان يتوقف التطبيق عن العمل او يظهر بشكل لاتريد عزيزي المبرمج ان يظهر به وهذا ما تفعله لتجنبها :

✔ الاجراءات العادية :
        1-ان تقوم مجددا باعادة طلب البيانات من مصدرها سواءا كان api او قاعدة البيانات و  يمكن كذلك نقل البيانات او جرء منها الى النافدة المنشئة حديثا .
        2-وهذا ما لا تحمد عقباه صديقي  لان تطبيق يواجه مشكلة memory Leak و هذا يعني توقف التطبيق .
حسنا ما الحل : بالطبع ViewModal سيتكلف بالمهمة =>
هذا العصنر لديه القدرة على البقاء حيا عند حدوث تغييرات على الهاتف كشقلبت الهاتف دون معنى من المستخدم 😂😂 مما يعني انه حتى عند اعادة النافدة او دمارها فسيبقى لدينا نفس modal لناخد منه المعلومات مجددا دون الحاجة الى ارسال طلب جديد للسرفير او قاعدة البيانات وحتى لو شقلب الهاتف اثناء جلب المعلومات فالفيو مودل سينظر الى حين اعادة انشاء النافدة و هذا ان وقع بدون هذا العنصر فهو كارثة عظمى .
الصورة من موقع meduim و تبين طريقة عمل الفيو مودل مقارنة مع UI Data Holder

✔ طريقة استخدام الفيو مودل :

        1-بعد ذلك قم باضافة المكتبة الى dependency الخاص بالمشروع ->

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

//
        2-انشاء data class :
لنفترض ان لدينا مستخدمين لكل واحد منهم اسم و عنوان و جنس .

data class(val name:String,val adderess:String,val gender:String)
 
        3-انشاء الفيو موديل :

class UsersViewModel : ViewModel() {

 private val userList: List? = null

 fun getUserList(): List? {
  if (userList == null) {
   usersList = loadUsers()
  }
  return userList
 }

 private fun loadUsers(): List {
  // قم بجلب الداتا من قاعدة البيانات اومن اي بي اي ريست
 }
}

4-و من ثم يمكنك الوصول الى List من النافذة الرئيسية :


class MainActivity:AppCompatActivity(){
 
 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
  model.getUsers().observe(this, { users ->
   // قم بتحديث الواجهة
  })
 }
}

: ViewModel vs onSaveInstanceState()  

قد تتسائل صديقي ما الفرق بينهما او تقول الفيو مودل معوض له لا الامر عكس كذلك تماما فاستخدام الاول وحده و التاني وحده .
الفيو مودل عزيزي المبرمج موجود فقط ليعيد اعطاء البيانات للنافذة في كل مرة يتم اعادة انشائها في حين  onSaveInstanceState يبقى حيا حتى عندما يوقف النظام التطبيق لتحرير بعض الذاكرة مثلا وقد يتسائل سائل ما الفائدة من وجودهما معا ؟ و انا ارد و اقول ان onSaveInstanceState لديه عيوب و هي :
      1-لا يخزن الا كمية صغيرة من البيانات.
      2-البيانات التي تخزنها فيه يجب ان تكون  Parcelable و هذا يشكل صعوبة عند تخزين القيم .
لهذا استعمل الفيو مودل لتخزين البيانات الفعلية للمستخدم.
و استعمل onSaveInstanceState لتخزين القيم المهمة لجلب باقي المعلومات مثلا تخزين المعرف  id .
الدرس المستفاذ لا تقلب الهاتف 😂😂.

خلاصة القول : مهما فعل المستخدم من حركات شيطانية فاننا له بالمرصاد فان ثم قلب الجهاز الفيو موديل سيحتفظ بالدتا الى حين اعادة انشاء النافذة.
اتمنى ان تعجبكم التذوينة .
اغلب ما في التدوينة ماخودة من هذا الفيديو
هل ترغب في مثل هذه التدوينات

اسماعيل ايت بلا

ببساطة ارغب في تجربة جديدة من التعلم من خلال مشاركة ما تعلمه يجبرني ذلك على البحث لمدة طويلة مما يجعل الموقع جديرا بالثقة

اترك لنا تعليقا

الاشتراك بالقائمة البريدية

توصل باحدث مواضيعنا و كن على اطلاع باخر اخبار وتقنيات الاندرويد