Recientemente, estoy explorando la Arquitectura de Android, que ha sido introducida recientemente por Google. De la documentación he encontrado esto:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
la actividad puede acceder a esta lista de la siguiente manera:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
Mi pregunta es, voy a hacer esto:
en la
loadUsers()
función estoy obteniendo los datos de forma asincrónica donde primero verificaré la base de datos (Habitación) para esos datosSi no obtengo los datos allí, realizaré una llamada a la API para obtener los datos del servidor web.
Insertaré los datos obtenidos en la base de datos (Habitación) y actualizaré la interfaz de usuario de acuerdo con los datos.
¿Cuál es el enfoque recomendado para hacer esto?
Si empiezo Service
a llamar a la API desde el loadUsers()
método, ¿cómo puedo actualizar la MutableLiveData<List<User>> users
variable a partir de eso Service
?
loadUsers()
básicamente llamará al repositorio para obtener la información del usuarioRespuestas:
Supongo que está utilizando componentes de arquitectura de Android . En realidad, no importa dónde llame
service, asynctask or handler
para actualizar los datos. Puede insertar los datos del servicio o del asynctask usando elpostValue(..)
método. Tu clase se vería así:Tal como
users
estáLiveData
, laRoom
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 remotos.fuente
LiveData
no se actualizausers.postValue(mUsers);
-> Pero, ¿el método postValue de MutableLiveData puede aceptar LiveData ???value
lugar depostValue
. Gracias por tu respuesta.Puede usar el
MutableLiveData<T>.postValue(T value)
método del hilo de fondo.fuente
.setValue()
que no estaría permitidoSi la aplicación está obteniendo datos del usuario en un hilo en segundo plano, será útil postValue (en lugar de setValue ).
En el método loadData hay una referencia al objeto "usuarios" MutableLiveData. El método loadData también obtiene algunos datos nuevos del usuario de algún lugar (por ejemplo, un repositorio).
Ahora, si la ejecución está en un hilo en segundo plano, MutableLiveData.postValue () actualiza a los observadores externos del objeto MutableLiveData.
Quizás algo como esto:
fuente
getUsers()
método del repositorio podría llamar a una API para los datos que son asíncronos (podría iniciar un servicio o asíncrono para esto) en ese caso, ¿cómo puede devolver la Lista de su declaración de retorno?Eche un vistazo a la guía de arquitectura de Android que acompaña a los nuevos módulos de arquitectura como
LiveData
yViewModel
. Discuten este tema exacto en profundidad.En sus ejemplos, no lo ponen en un servicio. Eche un vistazo a cómo lo resuelven utilizando un módulo de "repositorio" y Retrofit. Los apéndices en la parte inferior incluyen ejemplos más completos que incluyen la comunicación del estado de la red, informes de errores, etc.
fuente
Si está llamando a su api en el repositorio, entonces,
En repositorio :
En ViewModel
En actividad / Fragmento
Nota: Usando JAVA_1.8 lambda aquí, puede usar sin él
fuente