Sobes.tech
Junior

Jetpack ViewModel haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

ViewModel — Jetpack komponentidir və UI ilə əlaqəli məlumatların saxlanması və idarə olunması üçün nəzərdə tutulmuşdur. Onun əsas məqsədi — konfiqurasiya dəyişiklikləri zamanı, məsələn, ekranın döndürülməsi, və ya Activity və ya Fragment-in həyat dövrü boyunca məlumatları saxlamaq və ondan keçməkdir.

ViewModel-in xüsusiyyətləri:

  • Məlumatların saxlanması: Konfiqurasiya dəyişikliklərinə və hətta Activity/Fragment-in ölümü ilə belə məlumatları bərpa edir.
  • Loqikanın ayrılması: UI üçün məlumatların hazırlanması loqikasını UI-dən (Activity/Fragment) ayırır.
  • Həyat dövrü ilə əlaqəli: Activity və ya Fragment-in həyat dövrü ilə əlaqəlidir.
  • Yaddaş sızmalarının qarşısını alır: View, Lifecycle və ya Activity/Fragment-ə birbaşa istinad etmir, bu da yaddaş sızmalarını qarşısını alır.

İstifadəsi:

  1. ViewModel-dən irəli gələn sinif yaradın.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Məlumatların ilkinləşdirilməsi
        }
    
        fun fetchData() {
            // Məlumatların yüklənməsi loqikası
            _data.value = "Yüklənmiş məlumatlar"
        }
    
        override fun onCleared() {
            // Resursların təmizlənməsi
            super.onCleared()
        }
    }
    
  2. Activity və ya Fragment-də ViewModel nümunəsini alın.

    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 yeniləyin
            })
    
            viewModel.fetchData()
        }
    }
    
  3. ViewModelProvider.Factory istifadə edərək, asılılıqları olan ViewModel nümunələrini yaradın.

    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("Naməlum ViewModel sinfi")
        }
    }
    
    // Activity/Fragment-də
    // val repository = MyRepository() // Asılılıq injeksiyası
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

onSaveInstanceState() ilə müqayisə:

Xüsusiyyət ViewModel onSaveInstanceState()
Konfiqurasiya dəyişikliklərini keçirmək Bəli Bəli (kiçik məlumatlar üçün)
Prosesin davamlılığı Yox (proses bağlandıqdan sonra məlumatlar itir) Bəli (kiçik məlumatlar üçün)
Məlumatların saxlanması Obiektlər, LiveData Bundle (primitivlər, Serializable, Parcelable)
Yaddaş sızmaları Yox (düzgün istifadə olunarsa) Mümkündür, Activity/View-ə istinadlar saxlanarsa
İcra çətinliyi Daha çətindir sadə ssenarilər üçün Daha sadə, sadə ssenarilər üçün

ViewModel daha dayanıqlı və asan test edilə bilən tətbiqlər yaratmağa kömək edir, UI və məlumatların işlənməsi loqikasını ayırır.