Junior
Պատմիր ինձ Jetpack ViewModel-ի մասին։
sobes.tech AI
Պատասխան AI-ից
ViewModel-ը պահպանում և կառավարում է UI-կապված տվյալները՝ հաշվի առնելով կյանքի ցիկլը: Նա ապրում է կոնֆիգուրացիայի փոփոխությունների ժամանակ (էկրանին պտտում, դասավորության փոփոխություններ), կանխելով տվյալների կորուստը:
Հիմնական առանձնահատկություններ՝
- Տվյալների պահպանություն: ViewModel-ը չի ոչնչացվում կոնֆիգուրացիայի փոփոխությունների ժամանակ, պահպանում է UI-ի վիճակը:
- Լոգիկայի բաժանում UI-ից: Բիզնես-լոգիկան տեղադրվում է ViewModel-ում, ինչը հեշտացնում է թեստավորումը և սպասարկումը Activity/Fragment:
- Ինտեգրացիա LiveData-ի հետ: Սովորաբար օգտագործվում է LiveData-ի հետ՝ տվյալների փոփոխությունները հետևելու համար:
Օրինակ՝
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Տվյալներ, որոնք անհրաժեշտ է պահպանել կոնֆիգուրացիայի փոփոխության ժամանակ
var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
private lateinit var counterText: TextView
private lateinit var incrementButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Ստանալ ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Ցույց տալ ViewModel-ից տվյալները
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Տևողություն՝ ViewModel-ը ապրում է այնքան ժամանակ, քանի դեռ ապրում է նրա կապված Scope-ը (օր․, Activity): Երբ Scope-ը ավարտվում է, ViewModel-ը ոչնչացվում է:
ViewModelProviders (այժմ՝ ViewModelProvider) օգտագործվում էր ViewModel-ի օրինակ ստանալու համար Kotlin-ից առաջ: Kotlin-ում խորհուրդ է տրվում օգտագործել ViewModelProvider(this).get(MyViewModel::class.java):
Հիմնական առավելությունները՝
- Կենդանանում է կոնֆիգուրացիայի փոփոխությունների ժամանակ:
- Կառավարվում է Jetpack-ի կյանքի ցիկլի շրջանակով:
Անբարենպաստ կողմերը՝
- Կարող է շատ մեծ լինել բարդ UI-լոգիկայի դեպքում:
- Չպետք է պարունակի հղումներ View-ին, Context-ին կամ այլ կյանքի ցիկլ ունեցող օբյեկտների՝ խուսափելու համար հիշողության լիքներից: