2010-06-13 7 views
9

Actualmente estoy desarrollando una aplicación de Android, necesita descargar contenido de Internet. Utilizo el hilo para hacer eso y luego llamo al método runOnUiThread para actualizar la GUI.Enhebrado en Android

  1. Puse un menú de actualización en él, si el usuario intentaba actualizar el contenido, el hilo de descarga se creará y se iniciará. El problema es que, ¿cómo puedo controlar el orden de las secuencias? Necesito aceptar la respuesta de la última solicitud y abandonar las solicitudes de subprocesos anteriores si aún se están ejecutando otras solicitudes porque el usuario puede haber cambiado los parámetros de solicitud. Actualmente estaba usando un threadId para hacer esto, cuando termina un hilo, comprueba su threadId, si fue el último recodificado, toma el control y presenta la respuesta. Mi pregunta es ¿hay alguna otra mejor solución adecuada para esto?
  2. ¿Debo detener los hilos cuando el usuario sale de la aplicación? Recuerdo que algunos libros decían que no intentes detener manualmente el hilo y esperar a que termine es una buena práctica, ¿es así? ¿Debo detenerlos llamando al método "detener" o "interrumpir"?
  3. He leído algunos documentos sobre cómo enhebrar en Android y encontré la clase HandlerThread, ¿qué es? ¿En qué tipo de situación necesito usarlo?
+1

Esta publicación de blog puede ayudar: http://foo.jasonhudgins.com/2010/02/rebel-without-context.html Una gran idea en el La publicación de blog es para que su actividad registre/anule el registro de oyentes para "eventos" de finalización de descarga, que su servicio puede activar para actualizar la interfaz de usuario. –

Respuesta

4

En lugar de comenzar un nuevo hilo por cada acción de actualización, crearía un único hilo para todo el trabajo de descarga en segundo plano que realiza un bucle y descarga contenido alineado en una cola. Eso garantiza que no descargue contenido al mismo tiempo y que también ahorre recursos.

En la GUI simplemente pone en cola una solicitud de actualización siempre que el usuario lo solicite y puede cancelar una descarga en ejecución llamando al HttpRequestBase.abort en la instancia del método http. El hilo de fondo debe recibir y capturar un SocketException y pasar a la siguiente solicitud en cola.

Para finalizar el hilo de fondo solo tiene que finalizar su ciclo. Puede usar las clases Looper y Handler para ayudarlo con todo lo anterior, la clase HandlerThread que mencionó es simplemente una clase práctica para crear un hilo que tenga un Looper.

El problema con interrupt en un hilo es que no te saldrá de una solicitud de E/S de bloqueo y manejar un InterruptException correctamente puede ser complicado. Entonces, dependiendo de la situación, yo diría que sí, es una mejor práctica terminar el hilo volviendo de su método run.

+0

Si creé un hilo con looper, supongo que puede ejecutar mi solicitud alineada en una cola, y luego cómo puedo cancelarla si ingresa una nueva solicitud porque solo necesito el último resultado. – virsir

+0

Puede hacer referencia a su 'HttpGet' disponible y llamar a su método 'abort'. ¿O no estás usando 'HttpClient'? –

1

Puede usar un IntentService para iniciar sus operaciones en segundo plano, el servicio funcionará como "procesador de cola de trabajos" y ejecutará sus llamadas en orden.

Cuestiones relacionadas