Tenho uma AsyncTask
classe que executo que baixa uma grande lista de dados de um site.
No caso de o usuário final ter uma conexão de dados muito lenta ou irregular no momento do uso, eu gostaria de fazer o AsyncTask
tempo limite após um período de tempo. Minha primeira abordagem para isso é assim:
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
downloader.cancel(true);
}
}, 30000 );
Depois de iniciar o AsyncTask
, um novo manipulador é iniciado que cancelará AsyncTask
após 30 segundos, se ainda estiver em execução.
Será esta uma boa abordagem? Ou há algo embutido AsyncTask
que é mais adequado para esse fim?
java
android
android-asynctask
Jake Wilson
fonte
fonte
Respostas:
Sim, existe AsyncTask.get ()
Observe que, chamando isso no thread principal (AKA. Thread da interface do usuário) irá bloquear a execução. Você provavelmente precisará chamá-lo em um thread separado.
fonte
handler
abordagem descrita na minha pergunta? Parece muito mais simples porque o segmento interface do usuário não congelar-se enquanto espera para ser executado do Handler Runnable ...No caso, o seu downloader é baseado em uma conexão para URL, você tem vários parâmetros que podem ajudá-lo a definir um tempo limite sem código complexo:
Se você apenas colocar esse código em sua tarefa assíncrona, tudo bem.
O 'Tempo limite de leitura' é testar uma rede ruim durante toda a transferência.
O 'Tempo limite da conexão' é chamado apenas no início para testar se o servidor está ativo ou não.
fonte
Use a classe CountDownTimer ao lado da classe estendida para AsyncTask no método onPreExecute ():
Principal vantagem, o monitoramento assíncrono feito internamente na classe.
altere CountDownTimer (7000, 7000) -> CountDownTimer (7000, 1000), por exemplo, e ele chamará onTick () 6 vezes antes de chamar onFinish (). Isso é bom se você deseja adicionar algum monitoramento.
Obrigado por todos os bons conselhos que recebi nesta página :-)
fonte
Eu não acho que exista algo assim incorporado ao AsyncTask. Sua abordagem parece ser boa. Apenas verifique periodicamente o valor de isCancelled () no método doInBackground do AsyncTask para finalizar esse método depois que o thread da interface do usuário o cancelar.
Se você quiser evitar o uso do manipulador por algum motivo, verifique System.currentTimeMillis periodicamente em seu AsyncTask e saia no tempo limite, embora eu goste mais da sua solução, pois ela pode realmente interromper o encadeamento.
fonte
fonte
Você pode colocar mais uma condição para tornar o cancelamento mais robusto. por exemplo,
fonte
Inspirando-me na pergunta, escrevi um método que executa alguma tarefa em segundo plano via AsyncTask e, se o processamento demorar mais que LOADING_TIMEOUT, será exibida uma caixa de diálogo de alerta para tentar novamente.
fonte