🚀 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?

  1. Complexidade: O ciclo de vida dos Loaders era difícil de depurar e exigia muitos “callbacks” (onCreateLoader, onLoadFinished).
  2. Acoplamento: Os Loaders eram muito ligados a cursores e ao ContentProvider.
  3. 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 sendBroadcast ou notifyDataSetChanged. 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 CursorLoader para o padrão de Repositório. Isso tornará seu aplicativo muito mais fácil de testar com JUnit e Mockito.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️