Sobes.tech
Junior

Jetpack ViewModel hakkında konuş.

sobes.tech yapay zeka

AI'dan gelen yanıt

ViewModel, Jetpack bileşenleri arasında UI ile ilişkili verileri depolamak ve yönetmek için tasarlanmış bir bileşendir. Ana amacı, ekran döndürme gibi yapılandırma değişiklikleri sırasında UI verilerini korumak ve Activity veya Fragment yaşam döngüsünü aşmaktır.

ViewModel Özellikleri:

  • Veri saklama: Yapılandırma değişikliklerine ve hatta Activity/Fragment'in ölmesine rağmen verileri korur ve yeniden oluşturulurken verileri geri yükler.
  • Mantık ayırımı: UI için veri hazırlama mantığını UI'nin kendisinden (Activity/Fragment) ayırır.
  • Yaşam döngüsü ile bağlantı: Activity veya Fragment'in yaşam döngüsü ile ilişkilidir.
  • Bellek sızıntılarını önleme: View, Lifecycle veya Activity/Fragment'e doğrudan referanslar tutmaz, bu da bellek sızıntılarını engeller.

Nasıl kullanılır:

  1. ViewModel'den türeyen bir sınıf oluşturun.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Veri başlatma
        }
    
        fun fetchData() {
            // Veri yükleme mantığı
            _data.value = "Yüklenmiş veriler"
        }
    
        override fun onCleared() {
            // Kaynak temizliği
            super.onCleared()
        }
    }
    
  2. Activity veya Fragment'ta ViewModel örneği 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 güncellemesi
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Bağımlılıklarla birlikte ViewModel örnekleri oluşturmak için ViewModelProvider.Factory kullanı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("Bilinmeyen ViewModel sınıfı")
        }
    }
    
    // Activity/Fragment'ta
    // val repository = MyRepository() // Bağımlılık enjeksiyonu
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

onSaveInstanceState() ile karşılaştırma:

Özellik ViewModel onSaveInstanceState()
Yapılandırma değişikliklerini aşma Evet Evet (küçük veri hacimleri için)
İşlem sonrası hayatta kalma Hayır (işlem sonlandırıldığında veriler kaybolur) Evet (küçük veri hacimleri için)
Veri saklama Nesneler, LiveData Bundle (ilkel, Serializable, Parcelable)
Bellek sızıntılarını önleme Hayır (doğru kullanılırsa) Mümkün, Activity/View referansları tutulursa
Uygulama karmaşıklığı Basit senaryolar için daha karmaşık olabilir Basit senaryolar için daha kolay

ViewModel, UI'yi veri işleme mantığından ayırarak daha dayanıklı ve test edilmesi daha kolay uygulamalar oluşturmanıza yardımcı olur.