Sobes.tech
Junior

Jetpack ViewModel haqida gapir.

sobes.tech AI

AIdan javob

Jetpack komponenti bo'lib, UI bilan bog'liq ma'lumotlarni saqlash va boshqarish uchun mo'ljallangan ViewModel komponentidir. Uning asosiy maqsadi - konfiguratsiya o'zgarishlari, masalan, ekranni aylantirish vaqtida UI ma'lumotlarini saqlash va Activity yoki Fragmentning hayot aylanishidan o'tib ketish.

ViewModel xususiyatlari:

  • Ma'lumotlarni saqlash: Konfiguratsiya o'zgarishlariga va hatto Activity/Fragment o'limiga qarshi turadi, qayta yaratishda ma'lumotlarni tiklaydi.
  • Mantiqni ajratish: UI uchun ma'lumotlarni tayyorlash mantiqini UI (Activity/Fragment) dan ajratadi.
  • Hayot aylanishiga bog'liq: Activity yoki Fragmentning hayot aylanishiga bog'liq.
  • Xotira oqib ketishining oldini olish: View, Lifecycle yoki Activity/Fragmentga to'g'ridan-to'g'ri murojaat qilmaydi, bu esa xotira oqib ketishini oldini oladi.

Qanday foydalanish:

  1. ViewModel dan meros olgan sinf yarating.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Ma'lumotlarni boshlash
        }
    
        fun fetchData() {
            // Ma'lumotlarni yuklash mantiqi
            _data.value = "Yuklangan ma'lumotlar"
        }
    
        override fun onCleared() {
            // Resurslarni tozalash
            super.onCleared()
        }
    }
    
  2. Activity yoki Fragmentda ViewModel nusxasini oling.

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    
            viewModel.data.observe(this, Observer { newData ->
                // UI ni yangilash
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Dependensiyalar bilan ViewModel nusxalarini yaratish uchun ViewModelProvider.Factory dan foydalaning.

    class MyViewModel(private val repository: MyRepository) : ViewModel() {
        // ...
    }
    
    class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(repository) as T
            }
            throw IllegalArgumentException("Noma'lum ViewModel sinfi")
        }
    }
    
    // Activity/Fragmentda
    // val repository = MyRepository() // Dependensiya injektsiyasi
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

onSaveInstanceState() bilan taqqoslaganda:

Xususiyat ViewModel onSaveInstanceState()
Konfiguratsiya o'zgarishlarini saqlash Ha Ha (kichik ma'lumotlar uchun)
Jarayon davomida saqlash Yo'q (jarayon yopilgach, ma'lumotlar yo'qoladi) Ha (kichik ma'lumotlar uchun)
Ma'lumotlarni saqlash Ob'ektlar, LiveData Bundle (primitivlar, Serializable, Parcelable)
Xotira oqib ketishining oldini olish Yo'q (to'g'ri ishlatilsa) Mumkin, Activity/View ga to'g'ridan-to'g'ri murojaat qilinsa
Amalga oshirish murakkabligi Oddiy ssenariylar uchun qiyinroq bo'lishi mumkin Oddiy ssenariylar uchun osonroq

ViewModel UI ni ma'lumotlarni ishlash mantiqidan ajratib, yanada mustahkam va test qilish oson bo'lgan ilovalar yaratishga yordam beradi.