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 мустақиман ишора надорад, ки шикастани хотираро пешгирӣ мекунад.
Чӣ гуна истифода бурдан:
-
Классеро эҷод кунед, ки аз
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() } } -
Барои эҷоди нусхаҳои ViewModel бо вобастагиҳо
ViewModelProvider.Factory-ро истифода баред.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-ро аз логикаи коркарди маълумот ҷудо мекунад.