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:
-
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() } } -
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() } } -
Usa
ViewModelProvider.Factoryper 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ì | 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.