2012-02-16 22 views
12

Estoy usando Fragments y LoaderManager. Tengo que iniciar un número desconocido de tareas, y pueden ejecutarse en paralelo (de lo contrario, solo volvería a utilizar uno y solo un cargador). Por ejemplo, tengo una vista de lista, y cada fila puede tener un botón para guardar el contenido de esa fila en un servidor web. El usuario podría iniciar una solicitud de guardado en varios elementos en paralelo.Patrón para cargadores múltiples con LoaderManager?

private int nextId = 0; 

private void onClickListener() { 
    Bundle bundle = new Bundle(); 
    bundle.putNextData(...); 
    getLoaderManager().initLoader(nextId++, bundle, this); 
} 

que podría intentar contabilidad a mí mismo, por lo que crear un grupo de cargadores manualmente y volver a utilizarlos cuando sea posible, parece que podría ser algo que ya está implementado por la API?

Gracias

+1

Buena pregunta. ¿Has logrado resolverlo? Creo que de alguna manera debes poner tus tareas en cola. –

Respuesta

4

no creo que se debe utilizar un cargador para guardar los datos a un servidor remoto.

En su lugar, utilice un IntentService o algo similar para procesar una cola de operaciones "guardar". De esta forma, su comunicación con el servidor web se puede agrupar, colapsar (es decir, guardar varias copias en cola para un solo elemento puede colapsarse en una sola operación) y vivir más allá de la duración de su actividad si es necesario.

Una cola procesada por un IntentService (o equivalente) es también una gran manera para volver a intentar las operaciones fallidas con retardo de envío, ya que se puede aplicar reintentos retardadas con retardo exponencial utilizando AlarmManager guardar.

+0

Y si tengo categorías 'n' en la base de datos y me gustaría cargarlas usando' CursorLoader'. ¿Qué identificación debería usar? – pixel

+1

Sin duda, puede utilizar ID arbitrarios, y probablemente solo enteros 1..n si las categorías son estáticas. Si primero está cargando una lista de categorías y luego detalles sobre cada categoría, entonces probablemente necesite optimizar su consulta. Pero suponiendo que no tienes otra opción, deberías usar identificadores estables como id. De cargador, no p. Ej. posiciones del cursor. –

1

Un servicio IntentService o enlazado son siempre buenos enfoques para eso. Como puntos romanos, tenga en cuenta que no es muy recomendable encargar varias solicitudes y llamarlas por separado (es muy probable que dedique mucho trabajo a la conexión de radio, al usar datos, que entre otras cosas agote la batería. Aquí está must-read sobre eso)

Yo personalmente recomendaría utilizar un servicio enlazado con una cola de solicitudes y un grupo de hilos disponibles (ese enfoque le da control total para operaciones de red más complejas como en su caso). Hay más detalles sobre el enfoque here y un ejemplo de trabajo de caso de prueba sobre here.

Actualiza tu progreso.

0

Estás en la dirección correcta, déjame ayudarte un poco.

La reutilización es de hecho una buena idea, y usted no tiene que preocuparse por ello porque androide hizo por usted (o Java realidad;)

Se llama ThreadPoolExecuter, puede empezar a tantas tareas como desee y solo abrirá el número predefinido de subprocesos. (La práctica recomendada es intentar abrir tantos subprocesos como se pueda ejecutar la conexión de red paralela en el dispositivo. Según mi investigación, está entre 4 y 9).

Y si intenta descargar la misma URL dos veces, puede protegerse y abrir solo una tarea para ello.

Cuestiones relacionadas