Parlez de Jetpack ViewModel.
sobes.tech IA
Réponse de l'IA
ViewModel est un composant de Jetpack conçu pour stocker et gérer les données de manière liée à l’interface utilisateur. Son objectif principal est de conserver les données de l’UI lors de changements de configuration, comme la rotation de l’écran, et de survivre au cycle de vie de l’Activity ou du Fragment.
Caractéristiques de ViewModel :
- Stockage des données : Survive aux changements de configuration et même à la destruction de l’Activity/Fragment, en restaurant les données lors de la recréation.
- Séparation de la logique : Sépare la logique de préparation des données pour l’UI de l’UI elle-même (Activity/Fragment).
- Lié au cycle de vie : Associé au cycle de vie de l’Activity ou du Fragment.
- Prévention des fuites de mémoire : Ne maintient pas de références directes à View, Lifecycle ou Activity/Fragment, ce qui empêche les fuites.
Comment l’utiliser :
-
Créez une classe héritant de
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Initialisation des données } fun fetchData() { // Logique de chargement des données _data.value = "Données chargées" } override fun onCleared() { // Nettoyage des ressources super.onCleared() } } -
Obtenez une instance de ViewModel dans une Activity ou un 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 -> // Mise à jour de l’UI }) viewModel.fetchData() } } -
Utilisez
ViewModelProvider.Factorypour créer des instances de ViewModel avec des dépendances.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 inconnue") } } // Dans l’Activity/Fragment // val repository = MyRepository() // Injection de dépendance // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Comparaison avec onSaveInstanceState() :
| Caractéristique | ViewModel | onSaveInstanceState() |
|---|---|---|
| Survie aux changements de configuration | Oui | Oui (pour petites quantités de données) |
| Survie au processus | Non (les données sont perdues après la destruction du processus) | Oui (pour petites quantités de données) |
| Stockage des données | Objets, LiveData | Bundle (primitifs, Serializable, Parcelable) |
| Fuites de mémoire | Non (si utilisé correctement) | Possible si des références à Activity/View sont maintenues |
| Complexité de mise en œuvre | Plus complexe pour scénarios simples | Plus simple pour scénarios simples |
ViewModel aide à créer des applications plus résistantes et faciles à tester, en séparant l’UI de la logique de traitement des données.