Recentemente, estou explorando a arquitetura Android, que foi introduzida recentemente pelo Google. Na documentação , encontrei o seguinte:
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
}
}
a atividade pode acessar essa lista da seguinte maneira:
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
});
}
}
Minha pergunta é, vou fazer isso:
na
loadUsers()
função, estou buscando os dados de forma assíncrona, onde primeiro verificarei o banco de dados (Room) para esses dadosSe eu não conseguir os dados lá, farei uma chamada de API para buscar os dados do servidor web.
Vou inserir os dados buscados no banco de dados (Room) e atualizar a IU de acordo com os dados.
Qual é a abordagem recomendada para fazer isso?
Se eu começar Service
a chamar a API a partir do loadUsers()
método, como posso atualizar a MutableLiveData<List<User>> users
variável a partir disso Service
?
loadUsers()
basicamente chamará o repo para obter as informações do usuárioRespostas:
Presumo que você esteja usando componentes de arquitetura Android . Na verdade, não importa onde você está ligando
service, asynctask or handler
para atualizar os dados. Você pode inserir os dados do serviço ou da asynctask usando opostValue(..)
método. Sua classe ficaria assim:Como
users
estáLiveData
, oRoom
banco de dados é responsável por fornecer os dados dos usuários onde quer que esteja inserido.Note:
Na arquitetura tipo MVVM, o repositório é principalmente responsável por verificar e puxar dados locais e dados remotos.fonte
LiveData
não está atualizandousers.postValue(mUsers);
-> Mas, o método postValue de MutableLiveData é capaz de aceitar LiveData ???value
vez depostValue
. Obrigado pela sua resposta.Você pode usar o
MutableLiveData<T>.postValue(T value)
método do thread em segundo plano.fonte
.setValue()
não seria permitidoSe o aplicativo estiver buscando dados do usuário em um thread de segundo plano, postValue (em vez de setValue ) será útil.
No método loadData, há uma referência ao objeto "usuários" MutableLiveData. O método loadData também busca alguns dados novos do usuário em algum lugar (por exemplo, um repositório).
Agora, se a execução for em um thread de segundo plano, MutableLiveData.postValue () atualiza observadores externos do objeto MutableLiveData.
Talvez algo assim:
fonte
getUsers()
método do repositório pode chamar uma api para os dados que são assíncronos (pode iniciar um serviço ou uma tarefa assíncrona para isso), nesse caso, como ele pode retornar a lista de sua instrução de retorno?Dê uma olhada no guia de arquitetura do Android que acompanha os novos módulos de arquitetura como
LiveData
eViewModel
. Eles discutem exatamente esse assunto em profundidade.Em seus exemplos, eles não o colocam em serviço. Dê uma olhada em como eles resolvem isso usando um módulo de "repositório" e Retrofit. Os adendos na parte inferior incluem exemplos mais completos, incluindo comunicação do estado da rede, relatórios de erros, etc.
fonte
Se você está chamando sua API no Repositório, então,
No Repositório :
Em ViewModel
Em atividade / fragmento
Observação: usando JAVA_1.8 lambda aqui, você pode usar sem ele
fonte