OnPostexecute não chamado após a conclusão assíncena
-
25-09-2019 - |
Pergunta
Por algum motivo meu onPostExecute()
não é chamado depois do meu AsyncTask
acabamentos.
Minha decleração de classe:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
Meu OnPostexecute ():
protected void onPostExecute(Boolean result)
Tudo funciona bem, meu doInBackground()
Conclui com êxito e retorna um booleano, mas ele apenas termina.
Obrigado
Solução
Você criou sua assínceta no tópico da interface do usuário? Adicione também um @Override Annotaiton no seu método onpostexecute () para garantir que você o declarasse corretamente.
Outras dicas
Você começou a tarefa com execute()
método? o onPostExecute
não funcionaria se você apenas invocasse o doInBackground
.
Encontrou/cometi outro erro desagradável:
Se seus params de onPostExecute(Param param)
Não corresponda ao que você definiu extends AsyncTask<...,...,Param>
E você não usou o @Override
Anotação, nunca será executado e você não receberá um aviso do Eclipse.
Nota para mim mesmo: apenas sempre use o @Override
Anotação e Eclipse o ajudarão.
Outra maneira fácil de evitar todos os erros nomeados:
no eclipse: Right-click in code > Source > Override/Implement Methods
Depois de ter o mesmo problema e nenhuma dessas respostas me ajudou, descobri que meu tópico da interface do usuário estava bloqueado (usei um CountDownLatch.await()
) e, portanto, o onPostExecute()
O método que deveria ser chamado pelo tópico da interface do usuário nunca foi chamado.
Cometi outro erro desagradável que pode resultar nesse mesmo erro. Ao definir a assínceta e chamá -la, eu não estava ligando execute
mas estava ligando doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
ao invés de
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
Eu enfrentei o mesmo problema. Nenhuma das soluções acima funcionou para mim. Então eu descobri o problema, talvez ajude outra pessoa.
No tópico da interface do usuário, chamo os seguintes códigos:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
Minha definição de classe de assíncas:
public class SaveAsync extends AsyncTask<Object, Void, Void> {
@Override
public Void doInBackground(Object... params) {
saveThem(); // long running operation
return null;
}
@Override
public void onPostExecute(Void param) {
XActivity.saveOperationInProgress = false;
}
@Override
public void onPreExecute() {
XActivity.saveOperationInProgress = true;
}
}
No código acima, o OnPostexecute não é chamado. É por causa de um loop infinito após a execução da assíncada. A assíncada e o loop inifinito se espera para terminar. Assim, o código ficou!
A solução está mudando o design!
Eu tive o mesmo comportamento, e a causa foi que eu estive postando muitas mensagens como um progresso dentro de doinbackground com o seguinte código:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
Isso deve ter sobrecarregado a fila de mensagens principais do Thrad e causou um longo atraso antes que o OnPostexecute fosse chamado. A solução era postar apenas uma vez a cada segundo.
Para mim, foi um erro do usuário. Eu estava encerrando a assínceta invocando o Cancel (true) e não lendo a documentação de perto para saber que o OnPostexecute não é chamado neste caso, o OnCancelled Is.