Sobes.tech
Junior

խոսիր Jetpack ViewModel-ի մասին։

sobes.tech AI

Պատասխան AI-ից

ViewModel-ը Jetpack-ի բաղադրիչ է, որը նախատեսված է պահելու և կառավարելու տվյալները այն ձևով, որը կապված է UI-ի հետ: Նրա հիմնական նպատակն է պահպանել UI տվյալները փոփոխությունների ժամանակ, ինչպես էկրանն ուղղելու ժամանակ, և գոյատևել Activity կամ Fragment-ի կյանքի ցիկլը:

ViewModel-ի առանձնահատկությունները՝

  • Տվյալների պահպանում: Գործում է փոփոխությունների ժամանակ և նույնիսկ Activity/Fragment-ի մահից հետո, վերականգնում է տվյալները վերածնվելու ժամանակ:

  • Լոգիկայի առանձնացում: Բաժանում է տվյալների պատրաստման լոգիկան 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. Ստացեք ViewModel-ի օրինակ Activity կամ Fragment-ում:

    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-ն տվյալների մշակման լոգիկայից։