Design per la sincronizzazione dei dati in Android

23

Ho visto due implementazioni per la sincronizzazione dei dati tra il server e il client sulla maggior parte delle app. Ciò presuppone che GCM non sia impostato: -

  1. Esecuzione periodica di un servizio intent che scarica i dati dalla rete e archivia nel database.
  2. Implementazione di un adattatore di sincronizzazione che viene eseguito periodicamente.

Quale dei precedenti consiglieresti di avere nella tua app e perché?

    
posta Rasmus 24.11.2013 - 04:20
fonte

6 risposte

12

Nota: gli adattatori di sincronizzazione vengono eseguiti in modo asincrono, pertanto è necessario utilizzarli con l'aspettativa che trasferiscano i dati regolarmente ed efficientemente, ma non istantaneamente. Se devi eseguire il trasferimento dei dati in tempo reale, dovresti farlo in un AsyncTask o in IntentService. - fonte .

In sostanza, se hai bisogno di trasferimento in tempo reale usa IntentService (la prima opzione), altrimenti SyncAdapter. Preferisco comunque un IntentService perché sembra più personalizzabile, ma un approccio più banale sarebbe usare un SyncAdapter.

    
risposta data 29.11.2013 - 16:23
fonte
18

Dipende molto dal tipo di sincronizzazione di cui hai bisogno.

periodico

Se la tua app è un'app di notizie che pubblica post in un determinato momento ogni giorno (diciamo alle 7.45 AM ogni giorno), quindi esegui un'attività periodica in un servizio in background, ad esempio alle 8 AM.

ad es. : Drippler. Mi informano una volta al giorno (intorno alle 18.30). Credo che utilizzino un compito periodico.

Evento attivato

Se il trasferimento dei dati viene attivato dall'azione dell'utente, utilizzare un servizio in background o un AsyncTask per il trasferimento dei dati.

ad es. : DropBox / Evernote. Si sincronizzano quando interagisco con l'app.

istantanea

Se la tua app esegue aggiornamenti di messaggistica istantanea / mail / non periodici importanti , allora hai bisogno di notifiche push, perché vuoi avvisare immediatamente l'utente. Utilizza GCM o Parse per questo caso. Ad esempio, WhatsApp / Google chat. Dato che hai esplicitamente menzionato che non vuoi utilizzare GCM, ti dirò perché dovresti utilizzare un provider di notifiche push standard invece di scrivere il tuo:

Le notifiche push funzionano istantaneamente - c'è un ritardo molto piccolo (nell'ordine dei secondi, raramente dei minuti). Se dovessi implementare la tua soluzione / libreria per fare ciò - in un modello naif, dovresti eseguire il ping del server ogni secondo o 5 secondi o un minuto per verificare lo stato. Questo è molto inefficiente in quanto consuma CPU (e quindi batteria), larghezza di banda sul cellulare e carico sul server. Tuttavia, in GCM / Parse, tengono sempre aperta una porta con il server (vedi qui ). Questo è il modo standard e più efficiente. Inoltre, se 10 app utilizzano GCM, non hai bisogno di 10 connessioni aperte, ne hai solo bisogno una per dispositivo. E davvero non vuoi sviluppare la tua soluzione, a meno che tu non abbia un valido motivo / fondi / tempo per farlo.

Una nota sull'adattatore di sincronizzazione : l'adattatore di sincronizzazione funziona bene per tutti i tre casi precedenti. Controlla Esegui un adattatore di sincronizzazione e vedrai che dipende da GCM o il proprio meccanismo (trigger di evento o soluzione personalizzata) o disponibilità di rete (evento innescato) o evento periodico. Tutto sommato, questa è una buona classe conveniente per sincronizzare i dati senza dover fare una lunga lista di inizializzazioni ogni volta o per implementare tutti i casi sopra in un unico posto.

    
risposta data 05.12.2013 - 12:45
fonte
3

C'è un aspetto di un SyncAdapter che non è stato menzionato dalle altre risposte.

Il modello SyncAdapter richiede che tu abbia un'autorizzazione specifica ContentProvider che tu sincronizzare e un tipo di account specifico (vedere Authenticator ) che verrà sincronizzato. Pertanto, a meno che tu non abbia già questi componenti nella tua architettura (ad esempio perché offri ad altre app l'accesso ai tuoi dati o devi supportare gli account) un SyncAdapter causerà un significativo overhead di implementazione.

    
risposta data 12.02.2016 - 16:40
fonte
2

Quando si tratta di sincronizzare i dati che implicano la connettività, si vorrebbe poter scalare anche. Credo che il modo migliore per farlo sia utilizzare l'adattatore di sincronizzazione.

Sembra anche che sia così se controlli la guida al traning di Android: Creazione un adattatore di sincronizzazione

The sync adapter component in your app encapsulates the code for the tasks that transfer data between the device and a server. Based on the scheduling and triggers you provide in your app, the sync adapter framework runs the code in the sync adapter component...

    
risposta data 29.11.2013 - 11:02
fonte
2

Schede di sincronizzazione dovrebbero essere utilizzate a meno che non sia necessario disporre di dati in tempo reale perché, Automatizza il trasferimento dei dati in base a una varietà di criteri, come le modifiche ai dati, il tempo trascorso, l'ora del giorno, ecc. Centralizza tutti i trasferimenti di dati in modo che il trasferimento dei dati avvenga in concomitanza con il trasferimento di dati da altre app, riducendo così l'utilizzo della batteria.

Per attività istantanee che possiamo usare,

AsyncTask per attività di breve durata, può essere 3-4 secondi.

IntentService per attività a lungo termine.

    
risposta data 05.12.2013 - 11:48
fonte
0

Dato che stiamo parlando di design, dovremmo menzionare la gestione di SyncAdapters, l'oggetto SyncResult e cosa succede dopo.

In realtà utilizzo un SyncAdapter per comunicare alla mia libreria di effettuare chiamate Web IntentService sul mio server. Gestire questa operazione di "sincronizzazione" è complicato.

Un approccio che sto prendendo ora è di rinunciare completamente all'oggetto SyncResult e utilizzare semplicemente un servizio per registrare i risultati di ogni singolo "Sync"

    
risposta data 22.03.2017 - 15:40
fonte

Leggi altre domande sui tag