Saltar al contenido

Cómo actualizar LiveData de un ViewModel desde el servicio en segundo plano y actualizar la interfaz de usuario

este problema se puede tratar de diferentes formas, pero nosotros te compartimos la respuesta más completa en nuestra opinión.

Solución:

Supongo que está utilizando componentes de arquitectura de Android. En realidad, no importa donde sea que estés llamando. service, asynctask or handler para actualizar los datos. Puede insertar los datos del servicio o de asynctask usando postValue(..) método. Tu clase se vería así:

private void loadUsers() 
    // do async operation to fetch users and use postValue() method
    users.postValue(listOfData)

como el users es LiveData, Room La base de datos es responsable de proporcionar datos a los usuarios donde sea que se inserte.

Note: En una arquitectura similar a MVVM, el repositorio es principalmente responsable de verificar y extraer datos locales y datos remotos.

Puedes usar MutableLiveData.postValue(T value) método del subproceso de fondo.

private void loadUsers() 
    // do async operation to fetch users and use postValue() method
   users.postValue(listOfData)

… en la función loadUsers() estoy obteniendo los datos de forma asincrónica… Si inicio un servicio para llamar a la API desde el método loadUsers(), ¿cómo puedo actualizar la variable de usuarios MutableLiveData> de ese servicio?

Si la aplicación está obteniendo datos de usuario en un subproceso en segundo plano, postValue (en lugar de setValue) será útil.

En el método loadData hay una referencia al objeto “usuarios” MutableLiveData. El método loadData también obtiene algunos datos de usuario nuevos de algún lugar (por ejemplo, un repositorio).

Ahora, si la ejecución está en un subproceso en segundo plano, MutableLiveData.postValue() actualiza los observadores externos del objeto MutableLiveData.

Tal vez algo como esto:

private MutableLiveData> users;

.
.
.

private void loadUsers() 
    // do async operation to fetch users
    ExecutorService service =  Executors.newSingleThreadExecutor();
    service.submit(new Runnable() 
        @Override
        public void run() 
            // on background thread, obtain a fresh list of users
            List freshUserList = aRepositorySomewhere.getUsers();

            // now that you have the fresh user data in freshUserList, 
            // make it available to outside observers of the "users" 
            // MutableLiveData object
            users.postValue(freshUserList);        
        
    );


Si te apasiona la programación, eres capaz de dejar una división acerca de qué te ha impresionado de este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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