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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top