Junior
Habla sobre Jetpack ViewModel.
sobes.tech AI
Respuesta de la IA
ViewModel es un componente de Jetpack diseñado para almacenar y gestionar datos de manera vinculada a la interfaz de usuario. Su objetivo principal es mantener los datos de la UI durante cambios de configuración, como la rotación de pantalla, y sobrevivir al ciclo de vida de una Activity o Fragment.
Características de ViewModel:
- Almacenamiento de datos: Sobrevive a cambios de configuración e incluso a la destrucción de la Activity/Fragment, restaurando los datos al ser recreados.
- Separación de lógica: Separa la lógica de preparación de datos para la UI del propio UI (Activity/Fragment).
- Vinculación al ciclo de vida: Está asociado con el ciclo de vida de la Activity o Fragment.
- Prevención de fugas de memoria: No mantiene referencias directas a View, Lifecycle o Activity/Fragment, lo que previene fugas de memoria.
Cómo usar:
-
Crea una clase que herede de
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Inicialización de datos } fun fetchData() { // Lógica para cargar datos _data.value = "Datos cargados" } override fun onCleared() { // Limpieza de recursos super.onCleared() } } -
Obtén una instancia de ViewModel en una 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 -> // Actualización de la UI }) viewModel.fetchData() } } -
Usa
ViewModelProvider.Factorypara crear instancias de ViewModel con dependencias.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("Unknown ViewModel class") } } // En la Activity/Fragment // val repository = MyRepository() // Inyección de dependencia // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Comparación con onSaveInstanceState():
| Característica | ViewModel | onSaveInstanceState() |
|---|---|---|
| Sobrevivir a cambios de configuración | Sí | Sí (para datos pequeños) |
| Sobrevivir a proceso | No (los datos se pierden tras destruir el proceso) | Sí (para datos pequeños) |
| Almacenamiento de datos | Objetos, LiveData | Bundle (primitivos, Serializable, Parcelable) |
| Fugas de memoria | No (si se usa correctamente) | Posible si se mantienen referencias a Activity/View |
| Complejidad de implementación | Más complejo para escenarios simples | Más sencillo para escenarios simples |
ViewModel ayuda a crear aplicaciones más resistentes y fáciles de probar, separando la UI de la lógica de procesamiento de datos.