Olá, pessoal.
Gostaria de entender melhor o funcionamento de um método usando o AsyncTask. No atualiza
abaixo, por exemplo, faço um filtro para aparecer somente as visitas cadastradas de acordo com a sua situação. Contudo, pelo log de erro, vi que estava dando NPE e coloquei o Toast para ver o que estava acontecendo. Ele realmente imprimia null
e o motivo foi a declaração do array List<Visita> visitas_filtradas = new ArrayList<>();
antes do for.
public void atualiza(List<Visita> visitas) {
List<Visita> visitas_filtradas = new ArrayList<>();
for (int i = 0; i < visitas.size(); i++) {
int finalI = i;
new BuscaVisita_String_DaSituacaoTask(situacaoDAO, visitas.get(i), encontrada -> {
if (encontrada != null) {
if (encontrada.equals(SITUACAO_CONTATO_ESCOLA_PARA) || encontrada.equals(SITUACAO_AMBIENTACAO_PARA)) {
visitas_filtradas.add(visitas.get(finalI));
}
}else
Toast.makeText(context, encontrada, Toast.LENGTH_SHORT).show();
}).execute();
}
this.visitas.clear();
this.visitas.addAll(visitas_filtradas);
notifyDataSetChanged();
}
Percebi que se eu colocasse a inicialização do array fora do método, como abaixo, o Toast imprimia a situação encontrada. Ou seja, não imprimir mais o null.
public void atualiza(List<Visita> visitas) {
-------------------------------------------------- Tirei o array visitas_filtradas que estava aqui e agora deu certo
for (int i = 0; i < visitas.size(); i++) {
int finalI = i;
new BuscaVisita_String_DaSituacaoTask(situacaoDAO, visitas.get(i), encontrada -> {
if (encontrada != null) {
Toast.makeText(context, "Aparece: " + encontrada, Toast.LENGTH_SHORT).show();
if (encontrada.equals(SITUACAO_CONTATO_ESCOLA_PARA) || encontrada.equals(SITUACAO_AMBIENTACAO_PARA)) {
visitas_filtradas.add(visitas.get(finalI));
}
}else
Toast.makeText(context, "Não aparece: " + encontrada, Toast.LENGTH_SHORT).show();
}).execute();
}
this.visitas.clear();
this.visitas.addAll(visitas_filtradas);
visitas_filtradas.clear();
notifyDataSetChanged();
}
Deu certo em partes. O problema disso é que o array duplicava as visitas quando o método atualiza
era chamado novamente. Teria que limpá-lo no início da chamada e, no código acima, o visitas_filtradas.clear();
ficou só no final.
Porém, se eu coloco visitas_filtradas.clear();
antes do for, dá NPE novamente com um NULL.
Por que isso acontece e o que fazer, por favor?