Sobes.tech
Junior

Vertel over Jetpack ViewModel.

sobes.tech AI

Antwoord van AI

ViewModel is een component van Jetpack ontworpen om UI-gerelateerde gegevens op te slaan en te beheren. Het hoofddoel is om UI-gegevens te behouden tijdens configuratiewijzigingen, zoals schermrotatie, en te overleven tijdens de levenscyclus van Activity of Fragment.

Kenmerken van ViewModel:

  • Gegevensopslag: Overleeft configuratiewijzigingen en zelfs het verlies van Activity/Fragment, door gegevens te herstellen bij hercreatie.
  • Logische scheiding: Scheidt de logica voor het voorbereiden van gegevens voor de UI van de UI zelf (Activity/Fragment).
  • Verbinding met levenscyclus: Is gekoppeld aan de levenscyclus van Activity of Fragment.
  • Voorkomen van geheugenlekken: Houdt geen directe referenties naar View, Lifecycle of Activity/Fragment, wat geheugenlekken voorkomt.

Hoe te gebruiken:

  1. Maak een klasse die erft van ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Gegevensinitialisatie
        }
    
        fun fetchData() {
            // Logica voor het laden van gegevens
            _data.value = "Laden gegevens"
        }
    
        override fun onCleared() {
            // Resources opruimen
            super.onCleared()
        }
    }
    
  2. Verkrijg een instantie van ViewModel in een Activity of 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 bijwerken
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Gebruik ViewModelProvider.Factory om instanties van ViewModel te maken met afhankelijkheden.

    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("Onbekende ViewModel-klasse")
        }
    }
    
    // In een Activity/Fragment
    // val repository = MyRepository() // Afhankelijkheidsinjectie
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Vergelijking met onSaveInstanceState():

Kenmerk ViewModel onSaveInstanceState()
Overleven bij configuratiewijzigingen Ja Ja (voor kleine gegevensvolumes)
Overleven van het proces Nee (gegevens gaan verloren na procesbeëindiging) Ja (voor kleine gegevensvolumes)
Gegevensopslag Objecten, LiveData Bundle (primitieven, Serializable, Parcelable)
Geheugenlekken voorkomen Nee (bij correct gebruik) Mogelijk bij het vasthouden van referenties naar Activity/View
Implementatiecomplexiteit Complexer voor eenvoudige scenario's Eenvoudiger voor eenvoudige scenario's

ViewModel helpt bij het maken van robuustere en beter testbare applicaties, door de UI te scheiden van de gegevensverwerkingslogica.