ViewModel con estado guardado en Android

Google lanzó Android Jetpack en Google I/O 2018, que es un paquete de componentes, herramientas y pautas para crear excelentes aplicaciones de Android. Incluía LiveData, ViewModel, Room Database, Work Manager y otros componentes. ViewModel se discutirá en este blog. En el ciclo de vida de la actividad, ViewModel mantiene datos relacionados con la interfaz de usuario. Permite que la aplicación resista cambios de configuración (como la rotación de pantalla).

Los ViewModels se utilizan principalmente para,

  1. Preparar datos para la capa de interfaz de usuario.
  2. Maneja la configuración de rotación de aplicaciones.

Imagen 1, Ver ciclo de vida del modelo.

Cómo agregar un modelo de vista

Kotlin

class gfgViewModel : ViewModel() {
    val courses = MutableLiveData<List<courses>>()
    fun getCourses(): LiveData<List<courses>> {
        return courses
    }
    private fun loadCourses() {
        courses.value = // courses provided by gfg
    }
}

Luego, para importar los datos a View,

Kotlin

class GeeksActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // Starting the model
        val gfgSampleModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        gfgSampleModel.getCourses().observe(this, Observer<List<courses>>{ courses ->
            // do something like UI update
        })
    }
}

Debemos inicializar el ViewModel en la Vista (Actividades/Fragmentos) usando,

Kotlin

val gfgSamplemodel = ViewModelProviders.of(this).get(GeeksModel::class.java)

Ahora podemos ver los datos en la interfaz de usuario:

Kotlin

gfgModel.getCourses().observe(this, Observer<List<Courses>>{ courses ->
            // Do something here
}

Así es como se usa ViewModel en nuestras Vistas. Puede encontrar más información sobre ViewModel aquí. Ahora podemos cambiar, pero está restringido. Para administrar eso, podemos usar onSaveInstanceState() para volver al estado anterior.

Cada aplicación de Android opera en su propio proceso de Linux, que se describe como muerte del proceso iniciado por el sistema. Este proceso lo inicia el programa cuando se debe ejecutar parte de su código, y continuará ejecutándose hasta que ya no sea necesario y el sistema necesite recuperar su memoria para que la utilicen otras aplicaciones.

GeekTip: Si su programa no está a la vanguardia, el sistema puede detenerlo en cualquier momento para liberar RAM del sistema para que la usen otros procesos.

  1. El paquete onSaveInstanceState() puede manejar tanto la configuración como la muerte del proceso iniciado por el sistema.
  2. Sin embargo, solo puede contener una cantidad limitada de datos y depende en gran medida de la velocidad y el almacenamiento porque la serialización requiere una gran cantidad de memoria para almacenar los datos.
  3. La serialización ocurre en el subproceso principal, por lo tanto, cuando cambia la configuración, la pantalla de la interfaz de usuario puede bloquearse y la aplicación también puede congelarse de productos ( ANR), es decir, la aplicación no responde.
  4. onSaveInstanceState() solo puede guardar una pequeña cantidad de datos.

Modelo de estado de vista guardado

Debido a que siempre se hace referencia a los datos de la interfaz de usuario desde ViewModel of Architecture Components y no desde View (Activity/Fragment), el estado guardado de ViewModel puede considerarse un sustituto de onSaveInstanceState(). Así que tendremos que ejecutar algún código para utilizar onSaveInstanceState().

Por lo tanto, como parte de Jetpack, Google lanzó el estado guardado, que nos permite retener y recuperar datos de los estados guardados después de haber sido eliminados por la muerte del proceso iniciado por el sistema.

GeekTip #2 : Cabe señalar que el estado debe ser básico y liviano. La persistencia local debe usarse para conjuntos de datos grandes o complicados.

Agregue el siguiente código a su compilación para integrar el estado guardado en Project.

implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'

¿Cómo hago uso del estado guardado?

Reemplace el siguiente fragmento de código en la función onCreate() de su Vista (Actividad/Fragmento).

val model = GeeksViewModel.of(this, savedVMState(this)).get(MainGfGViewModel::class.java)

en vez de:

val gfgModel= GeeksViewModel.of(this).get(MainGfGViewModel::class.java)

Además, en ViewModel:

class GeeksViewModel(private val state: SavedStateHandle) : ViewModel() { ... }

Como puede ver, proporcionamos SavedStateHandle a la función principal de ViewModel Object() { [código nativo] }. Para obtener un SavedStateHandle, usamos SavedStateVMFactory() como Factory en nuestro ViewModelProviders.of.

GeekTip #3 : Una fábrica es una interfaz que instruye al ViewModel sobre cómo construir el ViewModel.

Tenga en cuenta que es solo un par clave-valor. Incluso si el programa muere debido a la muerte del proceso iniciado por el sistema, los datos aún se guardarán.

Como puede ver, proporcionamos SavedStateHandle a la función principal de ViewModel Object() { [código nativo] }. Para obtener un SavedStateHandle, usamos SavedVMState() como Factory en nuestro GeeksViewModel.of.

Una fábrica es una interfaz que instruye al ViewModel sobre cómo construir el ViewModel.

  1. Incluso si el programa muere debido a la muerte del proceso iniciado por el sistema, los datos aún se guardarán.
  2. SavedStateHandle es similar a SharedPreferences en Android en que opera en un par clave-valor.
  3. Echemos un vistazo a un ejemplo: crearemos una aplicación con tres componentes de interfaz de usuario (EditText, Button y TextView).
  4. Cuando el usuario ingresa su nombre de usuario en EditText y hace clic en el botón, el nombre de usuario debe mostrarse en TextView

El MainViewModel ahora debería verse así,

Kotlin

class GeeksVM(private val savedStateHandle: SavedStateHandle) : ViewModel(), BaseViewModel {
    override fun getCoursename(): LiveData<String> {
        return savedStateHandle.getLiveData(Constants.COURSE)
    }
    override fun saveCourse(username: String) {
        savedStateHandle.set(Constant.COURSE, course)
    }
}

Aquí,

  1. Los datos se almacenan usando saveStateHandle.set («Clave», «Valor»).
  2. El método de estado guardado handle.get live data («clave») se utiliza para recuperar LiveData del tipo de datos String.

La clase MainViewModel implementa BaseViewModel, que tiene este aspecto.

Kotlin

interface gfgViewModel {
    fun getCoursename(): LiveData<String>
    fun saveCourse(username: String)
}

Validar

Realice el paso n.º 1 y no verá el nombre del paquete de su aplicación en la consola.

Cuando vuelva a abrir el programa, debería ver que la salida persiste y se muestra en TextView de la pantalla.

Notas importantes:

Si desea conservar los datos, utilice el estado guardado.

savedStateHandle.set("key_name","value")

Si desea recuperar datos de un estado guardado, use la siguiente sintaxis:

savedStateHandle.get("key_name")

Úselo si desea obtener LiveData como tipo de retorno.

savedStateHandle.getLiveData("key_name")

Si desea ver si una determinada clave está presente en SavedState, use el siguiente código.

savedState.contains("key_name")

Si desea ubicar todas las claves en el estado guardado, use lo siguiente para obtener una lista de ellas.

savedState.keys()

También puede eliminar cualquier valor individual accediendo a él a través de su clave. Para llevar a cabo la siguiente acción:

savedState.remove("key_name")

Publicación traducida automáticamente

Artículo escrito por therebootedcoder y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *