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:
-
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() } } -
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() } } -
Bağımlılıklarla birlikte ViewModel örnekleri oluşturmak için
ViewModelProvider.Factorykullanı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.