2012-01-27 5 views
7

La mia applicazione ha bisogno di una struttura dati simile a una coda: metti i dati al suo interno, ricevi dati da essa, tipo FIFO. Con i dati intendo stringhe semplici per ora, in seguito su oggetti forse più complessi. La cosa è che la coda e il suo contenuto dovrebbero essere persistenti, indipendentemente da ciò che sta facendo Android. Se l'applicazione viene chiusa e riaperta (o anche riavviata Android), la coda dovrebbe avere lo stesso stato e i dati che aveva prima che l'applicazione venisse chiusa.Come realizzare una coda persistente su Android

Penso che la coda debba utilizzare qualche tipo di memoria sotto il cofano, preferibilmente la memoria interna del dispositivo. Forse potresti fare un brainstorming su come realizzarlo. La coda non deve necessariamente essere eseguita nella mia applicazione, potrebbe anche essere un qualche tipo di servizio di background abbinato se questo è possibile in Android (ma privato per la mia applicazione).

risposta

7

Si consiglia di utilizzare un tavolo all'interno di Sqlite. Creerei il mio SqliteQueue che implementa l'interfaccia della coda. Offer aggiungerebbe la voce alla tabella. Poll restituirebbe una voce e rimuoverla dalla tabella. Per oggetti più complicati è possibile utilizzare GSON per convertire l'oggetto in una stringa JSON o convertire la stringa JSON in un oggetto.

+1

Io uso questo metodo per gestire la sincronizzazione offline dei codici a barre scansionati in un'app che ho recentemente scritto per lavoro. È anche possibile creare una classe serializzabile per archiviare più blocchi di dati di vari tipi e inserirli nel database. Dal momento che è nel database, è persistente, devi solo trovarlo e ritirarlo. Un'altra opzione è quella di archiviarlo come serializzabile in un file di testo nella directory di archiviazione privata per l'app se fondamentalmente stai solo memorizzando lo stato dell'applicazione. È più semplice dello storage db per un singolo batch di dati per lo stato dell'app. –

+0

Oh che coincidenza.La mia intenzione è quasi la stessa: scansiona codici a barre e cose simili e tienilo sul dispositivo per un po ', ad esempio se il dispositivo si trova in un'area senza segnale dove non può inviare dati a un server. Pensi che anche questo potrebbe funzionare in modo affidabile con i file nella memoria interna o il database SQLite è una soluzione molto migliore qui? – ceran

+1

Database. Quindi non è necessario scrivere e riscrivere il file ogni volta che si cambia. Non devi preoccuparti di analizzare il file. Anche l'utilizzo delle classi helper di Sqlite non è difficile. – Frohnzie

1

Sono carina non ci sono tali strutture dati nell'API Java, ma non dovrebbero esserci problemi nell'implementazione del proprio tipo di Queue. Dai uno sguardo al documento this, che contiene la descrizione dei meccanismi di archiviazione dei dati in Android. Ti suggerisco di utilizzare SharedPreferences, ma puoi scegliere quello che più si adatta alla tua applicazione. È possibile estendere una delle raccolte Java che implementa l'interfaccia Queue e aggiungere i meccanismi di persistenza utilizzando gli approcci di archiviazione di Android. Spero che questo ti aiuti.

+0

SharedPreferences sono per tipi primitivi di dati (cioè int, doppie, String). – Frohnzie

+0

@Frohnzie, Ogni raccolta in Java ha la sua rappresentazione String. – Egor

8

maggio squareup è una buona scelta.

QueueFile è un FIFO velocissimo, transazionale e basato su file. L'aggiunta e la rimozione da un'istanza è un'operazione O (1) ed è atomica. Le scritture sono sincrone; i dati verranno scritti sul disco prima che l'operazione ritorni. Il file sottostante è strutturato per sopravvivere al processo e persino ai crash del sistema e se un'eccezione I/O viene lanciata durante una modifica mutante, la modifica viene interrotta.

3

Questa è una buona libreria dal Percorso:

https://github.com/path/android-priority-jobqueue

"A Coda processi scritto specificamente per Android di pianificare facilmente posti di lavoro (task) che funzionano in background, migliorando UX e la stabilità delle applicazioni."

e fornire molte caratteristiche come priorità, controllo di rete, ecc callback