2012-02-16 16 views
12

Sto usando Fragments e LoaderManager. Devo lanciare un numero imprecisato di compiti, e potrebbero essere eseguiti in parallelo (altrimenti avrei solo riutilizzato uno e un solo caricatore). Ad esempio, ho un listview e ogni riga potrebbe avere un pulsante per salvare il contenuto di quella riga su un server web. L'utente può avviare una richiesta di salvataggio su più elementi in parallelo.Pattern per più caricatori con LoaderManager?

private int nextId = 0; 

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

ho potuto provare io stesso contabilità, in modo da creare un pool di caricatori manualmente e riutilizzarli quando possibile, sembra che potrebbe essere qualcosa di già attuato dal API?

Grazie

+1

Bella domanda. Sei riuscito a risolverlo? Penso che dovresti in qualche modo accodare i tuoi compiti. –

risposta

4

non credo si dovrebbe usare un caricatore per salvare i dati a un server remoto.

Utilizzare invece un IntentService o qualcosa di simile per elaborare una coda di operazioni di "salvataggio". In questo modo, le comunicazioni con il server Web possono essere raggruppate, compresse (ad esempio, più salvataggi in coda per un singolo articolo possono essere compressi in un'unica operazione) e, se necessario, vivranno oltre la durata della tua attività.

Una coda di salvataggio elaborata da un IntentService (o equivalente) è anche un ottimo modo per riprovare le operazioni non riuscite con backoff, dal momento che è possibile implementare tentativi ritardati con backoff esponenziale utilizzando AlarmManager.

+0

E se ho 'n' categorie nel database e vorrei caricarle usando 'CursorLoader'. Quale ID dovrei usare? – pixel

+1

È possibile utilizzare ID arbitrari e probabilmente solo numeri interi 1..n se le categorie sono statiche. Se stai caricando prima un elenco di categorie e poi i dettagli su ciascuna categoria, probabilmente dovrai ottimizzare la tua query. Ma supponendo che tu non abbia altra opzione, dovresti usare id stabili come id Loader, non ad es. posizioni del cursore. –

1

Un IntentService o servizio associato è sempre un buon approccio per questo. Come punti romani, si noti che non è consigliabile scovare diverse richieste e chiamarle separatamente (è molto probabile che si lavori molto sulla connessione radio - quando si usano i dati - che tra le altre cose consumano la batteria. a tale proposito)

Personalmente raccomando di utilizzare un servizio associato con una coda di richieste e un pool di thread disponibili (questo approccio ti dà il controllo totale per operazioni di rete più complesse come nel tuo caso). Sono disponibili ulteriori dettagli sull'approccio here e un esempio di esempio di banco di prova su here.

Aggiornaci sui tuoi progressi.

0

Sei nella giusta direzione, lascia che ti aiuti un po '.

Riutilizzo è davvero una buona idea, e non si deve preoccupare, perché Android ha fatto per voi (o Java in realtà;)

Si chiama ThreadPoolExecuter, si può iniziare come molti compiti come si desidera e aprirà solo il numero predefinito di thread (la best practice sta tentando di aprire tanti thread quanti sono i collegamenti di rete paralleli che possono essere eseguiti sul dispositivo.) Dalla mia ricerca è tra 4 e 9).

E se si sta tentando di scaricare lo stesso URL due volte, è possibile proteggersi e aprire solo un'attività per esso.

Problemi correlati