Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Possível melhoria no projeto por meio do padrão Delegation

Notei uma baixa coesão da classe GetAlunoTask pois entendo que a responsabilidade dela deveria ser, única e exclusivamente, a execução de uma operação de banco de dados; recuperação dos alunos no caso, e não atualizar o adapter.

Creio que uma forma mais adequada de implementar seria delegando a reponsabilidade da atualização do adapter para a classe que solicitou a execução da task. Eis minha implementação:

Interface que define o contrato para implementação do comportamento pós execução da task:

public interface GetAlunoTaskCallback {
    void onPostExecute(List<Aluno> result);
}

Classe que estende o AsyncTask:

public class GetAlunoTask extends AsyncTask<Void, Void, List<Aluno>> {


    private AlunoDAO dao;
    private GetAlunoTaskCallback callback;

    public GetAlunoTask(Context context, GetAlunoTaskCallback callback) {
        this.dao = AgendaDatabase.getInstance(context).getAlunoDAO();
        this.callback = callback;
    }

    @Override
    protected List<Aluno> doInBackground(Void... voids) {
        return dao.getAll();
    }

    @Override
    protected void onPostExecute(List<Aluno> result) {
        super.onPostExecute(result);
        this.callback.onPostExecute(result);
    }
}

Chamada da task na classe ListaAlunoView:

public void updateAlunos() {
        new GetAlunoTask(context, new GetAlunoTaskCallback() {
            @Override
            public void onPostExecute(List<Aluno> result) {
                adapter.update(result);
            }
        }).execute();
    }

Ps.: Podemos resumir em uma linha de código a chamada da task usando função lambda:

public void updateAlunos() {
        new GetAlunoTask(context, adapter::update).execute();
    }
2 respostas
solução!

Acabei de ver que há uma abordagem análoga na próxima aula deste curso... Então ignorem este post.

Fechei o tópico aqui