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();
}