Sobes.tech
Junior

Parla di Jetpack ViewModel.

sobes.tech AI

Risposta dell'AI

ViewModel è un componente di Jetpack progettato per memorizzare e gestire i dati in modo legato all'interfaccia utente. Il suo obiettivo principale è mantenere i dati dell'UI durante i cambiamenti di configurazione, come la rotazione dello schermo, e sopravvivere al ciclo di vita di Activity o Fragment.

Caratteristiche di ViewModel:

  • Salvataggio dei dati: Sopravvive ai cambiamenti di configurazione e anche alla morte di Activity/Fragment, ripristinando i dati alla ricreazione.
  • Separazione della logica: Separa la logica di preparazione dei dati per l’UI dall’UI stessa (Activity/Fragment).
  • Collegamento al ciclo di vita: È associato al ciclo di vita di Activity o Fragment.
  • Prevenzione di perdite di memoria: Non mantiene riferimenti diretti a View, Lifecycle o Activity/Fragment, prevenendo perdite di memoria.

Come usarlo:

  1. Crea una classe che erediti da ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Inizializzazione dei dati
        }
    
        fun fetchData() {
            // Logica di caricamento dei dati
            _data.value = "Dati caricati"
        }
    
        override fun onCleared() {
            // Pulizia delle risorse
            super.onCleared()
        }
    }
    
  2. Ottieni un'istanza di ViewModel in un'Activity o 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 ->
                // Aggiornamento UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Usa ViewModelProvider.Factory per creare istanze di ViewModel con dipendenze.

    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("Classe ViewModel sconosciuta")
        }
    }
    
    // In un'Activity/Fragment
    // val repository = MyRepository() // Iniezione delle dipendenze
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Confronto con onSaveInstanceState():

Caratteristica ViewModel onSaveInstanceState()
Sopravvivenza alle modifiche di configurazione Sì (per piccoli volumi di dati)
Sopravvivenza al processo No (i dati vengono persi dopo la distruzione del processo) Sì (per piccoli volumi di dati)
Memorizzazione dei dati Oggetti, LiveData Bundle (primitive, Serializable, Parcelable)
Perdita di memoria No (se usato correttamente) Possibile se si mantengono riferimenti a Activity/View
Complessità di implementazione Più complesso per scenari semplici Più semplice per scenari semplici

ViewModel aiuta a creare applicazioni più robuste e facili da testare, separando l’UI dalla logica di elaborazione dei dati.