🚀 8.6 Do Legado ao Moderno: De Loaders para ViewModels
No passado, os Loaders eram a solução padrão para carregar dados de forma assíncrona e reagir a mudanças no banco de dados. No entanto, com a chegada dos Android Architecture Components, o LoaderManager foi oficialmente depreciado. A Engenharia Premium utiliza o padrão ViewModel + LiveData.
Por que os Loaders foram substituídos?
- Complexidade: O ciclo de vida dos Loaders era difícil de depurar e exigia muitos “callbacks” (
onCreateLoader,onLoadFinished). - Acoplamento: Os Loaders eram muito ligados a cursores e ao
ContentProvider. - Memória: ViewModels são muito mais eficientes em gerenciar o estado da UI durante rotações de tela.
A Solução Premium (Java 17 + Room)
Em vez de monitorar um cursor manualmente, deixamos que o Room retorne um LiveData. O ViewModel apenas expõe esse dado para o Fragment:
// 1. O Repositório (Data Source)
public LiveData<List<Viagem>> listarTodasAsViagens() {
return viagemDao.listarTudo(); // O Room entende LiveData nativamente!
}
// 2. O ViewModel (Ponte)
public class ViagemViewModel extends ViewModel {
private final ViagemRepository repository;
private final LiveData<List<Viagem>> viagens;
public ViagemViewModel(ViagemRepository repo) {
this.repository = repo;
this.viagens = repository.listarTodasAsViagens();
}
public LiveData<List<Viagem>> getViagens() {
return viagens;
}
}Observação no Fragment
O Fragment agora só precisa de um “inscrito” (Observer). Sempre que o banco de dados mudar, a lista será atualizada automaticamente:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
var viewModel = new ViewModelProvider(this).get(ViagemViewModel.class);
viewModel.getViagens().observe(getViewLifecycleOwner(), lista -> {
// Atualiza o RecyclerView com a nova lista
adapter.submitList(lista);
});
}IMPORTANT
Reatividade Nativa: Com Room + LiveData, você não precisa mais de
sendBroadcastounotifyDataSetChanged. Se você inserir uma viagem em qualquer parte do app, a lista que está observando o banco será atualizada instantaneamente pelo sistema.
TIP
No Android Studio 2023.1, utilize o assistente de refatoração para migrar códigos que usam
CursorLoaderpara o padrão de Repositório. Isso tornará seu aplicativo muito mais fácil de testar com JUnit e Mockito.