Tengo una AsyncTask
clase que ejecuto que descarga una gran lista de datos de un sitio web.
En el caso de que el usuario final tenga una conexión de datos muy lenta o irregular en el momento del uso, me gustaría dejar el AsyncTask
tiempo de espera después de un período de tiempo. Mi primer acercamiento a esto es así:
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 );
Después de iniciar AsyncTask
, se inicia un nuevo controlador que cancelará AsyncTask
después de 30 segundos si aún se está ejecutando.
¿Es este un buen enfoque? ¿O hay algo integrado AsyncTask
que sea más adecuado para este propósito?
java
android
android-asynctask
Jake Wilson
fuente
fuente
Respuestas:
Sí, hay AsyncTask.get ()
Tenga en cuenta que al llamar a esto en el hilo principal (AKA. UI thread) bloqueará la ejecución, probablemente necesite llamarlo en un hilo separado.
fuente
handler
enfoque que describo en mi pregunta? Parece mucho más sencillo porque el hilo de la interfaz de usuario no se congela mientras espera ejecutar el Runler ejecutable del manejador ...En el caso, su descargador se basa en una conexión URL, tiene una serie de parámetros que podrían ayudarlo a definir un tiempo de espera sin código complejo:
Si solo lleva este código a su tarea asincrónica, está bien.
'Tiempo de espera de lectura' es probar una red defectuosa durante toda la transferencia.
'Tiempo de espera de conexión' solo se llama al principio para probar si el servidor está activo o no.
fuente
Use la clase CountDownTimer junto a la clase extendida para AsyncTask en el método onPreExecute ():
Ventaja principal, la supervisión asíncrona realizada internamente en la clase.
cambie CountDownTimer (7000, 7000) -> CountDownTimer (7000, 1000) por ejemplo y llamará a onTick () 6 veces antes de llamar a onFinish (). Esto es bueno si desea agregar algo de monitoreo.
Gracias por todos los buenos consejos que recibí en esta página :-)
fuente
No creo que haya algo así integrado en AsyncTask. Su enfoque parece ser bueno. Solo asegúrese de verificar periódicamente el valor de isCancelled () en el método doInBackground de su AsyncTask para finalizar este método una vez que el hilo de la interfaz de usuario lo cancele.
Si desea evitar usar el controlador por alguna razón, puede verificar System.currentTimeMillis periódicamente dentro de su AsyncTask y salir en el tiempo de espera, aunque me gusta su solución, ya que en realidad puede interrumpir el hilo.
fuente
fuente
Puede poner una condición más para hacer que la cancelación sea más sólida. p.ej,
fuente
Inspirando a partir de la pregunta, he escrito un método que realiza algunas tareas en segundo plano a través de AsyncTask y si el procesamiento lleva más de LOADING_TIMEOUT, aparecerá un diálogo de alerta para volver a intentarlo.
fuente