2012-02-13 16 views
7

Ho implementato un servizio di coda in Android che cambierà gli stati in base agli eventi di connettività di coda e wifi/dati.Efficace memorizzazione nella cache dei dati caricati su Android

I accodo le transazioni da registrare su un URL remoto. Se il dispositivo ha una connessione dati o Wi-Fi, itererà la coda e invierà i dati all'url finché la coda non sarà vuota, oppure è presente un evento di disconnessione.

Posso accedere alla mia app, abilitare la modalità aereo, generare dati, disattivare la modalità aereo e la transazione viene registrata. Nessun rallentamento, anche con migliaia di transazioni. (Stavo cercando di farlo un po ')

Inserire: bassa ricezione! La mia app rallenta enormemente quando la ricezione 3G è bassa. (Sì, tutto il caricamento avviene fuori dal thread dell'interfaccia utente.) Sembra che la causa di questo rallentamento abbia a che fare con il post sul server che impiega molto tempo ad accadere ea volte fallire.

La mia domanda è, come posso risolvere questo? Verifica la qualità del segnale? Sondare un indirizzo conosciuto? In che modo altre app, come Gmail, risolvono questo problema? Questo deve essere uno scenario comune!

+3

È sicuramente necessario disporre di un piano per casi come "la connettività è presente, ma il server è lento, irraggiungibile." Due idee: 1. mantenere la cache, definire la dimensione massima con cui si sta bene (che significa: quando è pieno non ti importa se gli eventi vengono gettati via). 2. Misurare il tempo richiesto da una richiesta. Se il tempo è maggiore del tempo necessario per generare eventi, sospendere più a lungo per caricare la connessione o il server. – vasquez

risposta

0

Bene, se potreste potenzialmente avere migliaia di attività che devono essere eseguite tutte, allora sicuramente dovrebbero essere gestite. Hai pensato di implementare il tuo ThreadPoolExecutor? La documentazione è molto buona e la classe è facile da capire, ma se avete bisogno di esempi provare questi siti:

Il vantaggio di questo è che è possibile limitare al massimo numero di thread che si stanno generando, quindi non si dovrebbe ottenere un rallentamento a livello di sistema se si limita il numero di thread a un numero ragionevole (per Android non consiglierei più di 20).

+0

Non sto eseguendo gli upload in parallelo. In una volta, c'è solo un caricamento in corso. Sì, la coda di caricamento si trova in un processo separato dall'applicazione "principale", ma il caricamento avviene solo uno alla volta. Sto fraintendendo il tuo suggerimento? – Jonathan

+0

Se si esegue solo un'attività alla volta e l'attività viene eseguita in background, perché rallenta l'interfaccia utente? O è quella la domanda da un milione di dollari? :) –

0

Si può fare qualche fine-tuning del timeout della presa e della connessione? Pertanto, se la connessione è lenta e in stallo, si verificherà un timeout e la trasmissione avrà esito negativo.

Dopo che la connessione/l'invio è fallita, è possibile riprovare a trasmettere in seguito o fare qualcos'altro.

Per regolare il timeout è possibile utilizzare il seguente codice:

HttpParams httpParameters = new BasicHttpParams(); 

HttpConnectionParams.setConnectionTimeout(httpParameters, 30 * 1000); 
HttpConnectionParams.setSoTimeout(httpParameters, 15 * 1000); 

HttpClient client = DefaultHttpClient(httpParameters); 
// use client... 
0

Abbiamo situazione simile per la nostra applicazione. Abbiamo considerato le emissioni di segnale come realtà e quelle che possono accadere in qualsiasi momento. Uno dei punti che seguiamo non è quello di rimuovere qualsiasi contenuto dal dispositivo a meno che non otteniamo una conferma funzionale dal server e basiamo solo sul codice di stato http. Come nella rete lenta o nei casi in cui possiamo perdere il segnale all'improvviso, mentre potremmo avere pubblicato il nostro contenuto, ci sono stati molti casi in cui i dati sono stati ricevuti solo parzialmente. E così abbiamo deciso di far conoscere al server il dispositivo in qualche modo [risultato attraverso alcune chiamate di richiesta basate su http effettuate dal dispositivo] che il contenuto è stato ricevuto. Più della performance o del controllo della rete, la domanda che ci avete posto, avevamo bisogno di un simile comportamento per la robustezza della nostra applicazione.

0

Si consiglia di utilizzare le intestazioni della gamma HTTP, ad esempio here.

Il server deve scrivere il carico utile sul disco durante la lettura e gestire i disconnessi. Il client non può sapere quanti byte il payload ha effettivamente raggiunto il server, quindi è necessario sincronizzarsi con il server ogni volta che si è verificato un errore di rete.Non dimenticare di gestire anche la batteria e problemi utente ;-)

0

Se si desidera attendere un segnale migliore, forse la classe SignalStrength, con i suoi metodi getCdmaDbm, getEvdoDbm e getGsmSignalStrength, è ciò che si sta cercando.

0

Dai un'occhiata a questo: http://www.youtube.com/watch?v=PwC1OlJo5VM#!

avanzate di codifica suggerimenti e trucchi, larghezza di banda di risparmio tecniche, modelli di implementazione, l'esposizione ad alcune delle funzioni API meno noti, e un'idea di come ridurre al minimo il consumo della batteria, garantendo la tua l'app è un buon cittadino sulla rete del vettore.

Problemi correlati