Sobes.tech
Junior

Jetpack ViewModel жөнүндө сөз кыл.

sobes.tech AI

AIден жооп

ViewModel — бул Jetpackтин компоненти, ал UI менен байланышкан маалыматтарды сактоо жана башкаруу үчүн арналган. Анын негизги максаты — конфигурация өзгөрүүлөрү учурунда, мисалы, экранды буруу, UI менен байланышкан маалыматтарды сактап калуу жана Activity же Fragmentтин жашоо циклинде жашооңузду сактоо.

ViewModelдин өзгөчөлүктөрү:

  • Маалыматтарды сактоо: Конфигурация өзгөрүүлөрүн жана Activity/Fragmentтин өлүмүн да өткөрүп, кайра түзүүдө маалыматтарды калыбына келтирет.
  • Логиканы бөлүү: UI үчүн маалыматтарды даярдоонун логикасын UIдан (Activity/Fragment) бөлүп турат.
  • Жашоо цикли менен байланыштуу: Activity же Fragmentтин жашоо цикли менен байланыштуу.
  • Эстутук чыгуу коргоо: View, Lifecycle же Activity/Fragmentке түз шилтемеси жок, бул эстутук чыгуу коргойт.

Колдонуу:

  1. ViewModelтен мурас алган класс түзүңүз.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Маалыматтарды баштапкы даярдоо
        }
    
        fun fetchData() {
            // Маалыматтарды жүктөө логикасы
            _data.value = "Жүктөлгөн маалыматтар"
        }
    
        override fun onCleared() {
            // Ресурстарды тазалоо
            super.onCleared()
        }
    }
    
  2. Activity же Fragmentте ViewModelдин экземплярин алыңыз.

    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 жаңыртуу
            })
    
            viewModel.fetchData()
        }
    }
    
  3. ViewModelProvider.Factory колдонуп, көзкарандылыктар менен ViewModelдин экземплярдарын түзүңүз.

    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("Белгисиз ViewModel классы")
        }
    }
    
    // Activity/Fragmentте
    // val repository = MyRepository() // көзкарандылыктарды инъекциялоо
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

onSaveInstanceState() менен салыштырып көрөлү:

өзгөчөлүк ViewModel onSaveInstanceState()
конфигурацияны сактоо Ооба Ооба (аз өлчөмдөгү маалыматтар үчүн)
процесстин сакталуусу Жок (процесс жапкандан кийин маалыматтар жоголот) Ооба (аз өлчөмдөгү маалыматтар үчүн)
маалыматтарды сактоо Объекттер, LiveData Bundle (примитивдер, Serializable, Parcelable)
эс тутум чыгуу Жок ( туура колдонулса) Мүмкүн, Activity/View шилтемелерин сактоо учурунда
ишке ашыруу татаалдыгы Жөнөкөй сценарийлер үчүн кыйынчылык Жөнөкөй, жөнөкөй сценарийлер үчүн

ViewModel туруктуу жана оңой тесттелүүчү колдонмолорду түзүүгө жардам берет, UI менен маалыматтарды иштетүү логикасын бөлүп турат.