խոսիր Jetpack ViewModel-ի մասին։
sobes.tech AI
Պատասխան AI-ից
ViewModel-ը Jetpack-ի բաղադրիչ է, որը նախատեսված է պահելու և կառավարելու տվյալները այն ձևով, որը կապված է UI-ի հետ: Նրա հիմնական նպատակն է պահպանել UI տվյալները փոփոխությունների ժամանակ, ինչպես էկրանն ուղղելու ժամանակ, և գոյատևել Activity կամ Fragment-ի կյանքի ցիկլը:
ViewModel-ի առանձնահատկությունները՝
-
Տվյալների պահպանում: Գործում է փոփոխությունների ժամանակ և նույնիսկ Activity/Fragment-ի մահից հետո, վերականգնում է տվյալները վերածնվելու ժամանակ:
-
Լոգիկայի առանձնացում: Բաժանում է տվյալների պատրաստման լոգիկան UI-ից (Activity/Fragment):
-
Կապված է կյանքի ցիկլին: Կապված է Activity կամ Fragment-ի կյանքի ցիկլին:
-
Հիշողության արտահոսքների կանխում: Չունի ուղիղ հղում View-ին, Lifecycle-ին կամ Activity/Fragment-ին, ինչը կանխում է հիշողության արտահոսքները:
Ինչպես օգտագործել՝
-
Ստեղծեք
ViewModel-ից ժառանգվող դաս:class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Տվյալների սկզբնական կարգավորում } fun fetchData() { // Տվյալների բեռնում լոգիկա _data.value = "Բեռնված տվյալներ" } override fun onCleared() { // Աղբյուրների մաքարում super.onCleared() } } -
Ստացեք 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() } } -
Օգտագործեք
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-ն տվյալների մշակման լոգիկայից։