Junior
Jetpack ViewModel haqida gapir.
sobes.tech AI
AIdan javob
Jetpack komponenti bo'lib, UI bilan bog'liq ma'lumotlarni saqlash va boshqarish uchun mo'ljallangan ViewModel komponentidir. Uning asosiy maqsadi - konfiguratsiya o'zgarishlari, masalan, ekranni aylantirish vaqtida UI ma'lumotlarini saqlash va Activity yoki Fragmentning hayot aylanishidan o'tib ketish.
ViewModel xususiyatlari:
- Ma'lumotlarni saqlash: Konfiguratsiya o'zgarishlariga va hatto Activity/Fragment o'limiga qarshi turadi, qayta yaratishda ma'lumotlarni tiklaydi.
- Mantiqni ajratish: UI uchun ma'lumotlarni tayyorlash mantiqini UI (Activity/Fragment) dan ajratadi.
- Hayot aylanishiga bog'liq: Activity yoki Fragmentning hayot aylanishiga bog'liq.
- Xotira oqib ketishining oldini olish: View, Lifecycle yoki Activity/Fragmentga to'g'ridan-to'g'ri murojaat qilmaydi, bu esa xotira oqib ketishini oldini oladi.
Qanday foydalanish:
-
ViewModeldan meros olgan sinf yarating.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Ma'lumotlarni boshlash } fun fetchData() { // Ma'lumotlarni yuklash mantiqi _data.value = "Yuklangan ma'lumotlar" } override fun onCleared() { // Resurslarni tozalash super.onCleared() } } -
Activity yoki Fragmentda ViewModel nusxasini oling.
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 ni yangilash }) viewModel.fetchData() } } -
Dependensiyalar bilan ViewModel nusxalarini yaratish uchun
ViewModelProvider.Factorydan foydalaning.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("Noma'lum ViewModel sinfi") } } // Activity/Fragmentda // val repository = MyRepository() // Dependensiya injektsiyasi // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
onSaveInstanceState() bilan taqqoslaganda:
| Xususiyat | ViewModel | onSaveInstanceState() |
|---|---|---|
| Konfiguratsiya o'zgarishlarini saqlash | Ha | Ha (kichik ma'lumotlar uchun) |
| Jarayon davomida saqlash | Yo'q (jarayon yopilgach, ma'lumotlar yo'qoladi) | Ha (kichik ma'lumotlar uchun) |
| Ma'lumotlarni saqlash | Ob'ektlar, LiveData | Bundle (primitivlar, Serializable, Parcelable) |
| Xotira oqib ketishining oldini olish | Yo'q (to'g'ri ishlatilsa) | Mumkin, Activity/View ga to'g'ridan-to'g'ri murojaat qilinsa |
| Amalga oshirish murakkabligi | Oddiy ssenariylar uchun qiyinroq bo'lishi mumkin | Oddiy ssenariylar uchun osonroq |
ViewModel UI ni ma'lumotlarni ishlash mantiqidan ajratib, yanada mustahkam va test qilish oson bo'lgan ilovalar yaratishga yordam beradi.