Pergunta

Eu estou usando um AsyncTask subclasse de algum processamento em segundo plano.O problema é que quando eu uso a classe com o .get() método, o ProgressDialog Eu especificar no onPreExecute() não mostra.

Eu funciona bem se eu usar uma chamada de retorno dentro do onPostExecute() o método.

Meu primeiro pensamento foi que isso foi porque o .get() aguarda a conclusão do processo, mas que não pode estar a bloquear o thread da INTERFACE do usuário ou, de modo que não é o caso.

Alguém pode explicar por que esse comportamento é por isso e se existe uma solução para isso ??Eu realmente gostaria de usar o .get() método de se conseguir.

Foi útil?

Solução

Eu inicialmente aceitou a resposta, mas parece ser errado.

O .get() método irá bloquear o thread de INTERFACE de utilizador para aguardar o resultado e quaisquer caixas de diálogo exibida também será bloqueado.Este é o comportamento esperado para este método.

A única alternativa é não usar .get() se a atividade de fundo é para qualquer um considerável período de tempo e, em vez de utilizar métodos de retorno de chamada para chamar a atividade.

Outras dicas

Chamar AysncTask.get() no thread da INTERFACE do usuário irá bloquear a UI thread de execução e fazer o thread de INTERFACE de utilizador de espera para AysncTask.doInBackground() para concluir.Fazendo isso, você está, na verdade, sacrifício, em benefício de AsycnTask, todos do código de agora são executadas de forma síncrona no thread da INTERFACE do usuário e o segmento de plano de Fundo (ainda dois thread, mas o thread de INTERFACE do usuário agora esperar para o segmento de plano de fundo).

Também tenha em mente que você provavelmente irá obter ANR exceção (bloqueada mais de 5 segundos) por chamada get() no thread da INTERFACE do usuário.

Se você realmente precisar usá-lo, contacte o seu showDialog() método antes de myAsyncTask.get():

showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.

Espero que isso ajude.

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