Conception pour synchroniser les données dans Android

23

J'ai vu deux implémentations pour synchroniser les données entre le serveur et le client sur la majorité des applications. Cela suppose qu'aucun GCM n'est configuré: -

  1. Exécution périodique d'un service d'intention qui télécharge les données du réseau et les stocke dans la base de données.
  2. Implémentation d'un adaptateur de synchronisation qui s'exécute périodiquement.

Lequel des éléments ci-dessus recommanderiez-vous d'avoir dans votre application et pourquoi?

Rasmus
la source

Réponses:

12

Remarque: Les adaptateurs de synchronisation s'exécutent de manière asynchrone, vous devez donc les utiliser dans l'espoir qu'ils transfèrent des données régulièrement et efficacement, mais pas instantanément. Si vous devez effectuer un transfert de données en temps réel, vous devez le faire dans un AsyncTask ou un IntentService. - source .

Fondamentalement, si vous avez besoin d'un transfert en temps réel, utilisez IntentService (la première option), sinon SyncAdapter. Je préfère cependant un IntentService car il semble plus personnalisable, mais une approche plus triviale serait d'utiliser un SyncAdapter.

Simon Zettervall
la source
18

Cela dépend fortement du type de synchronisation dont vous avez besoin.

Périodique

Si votre application est une application d'actualités qui publie des articles à une certaine heure chaque jour (disons à 7 h 45 tous les jours), vous exécutez une tâche périodique dans un service d'arrière-plan, disons à 8 heures.

par exemple : Drippler. Ils me préviennent une fois par jour (vers 18h30). Je crois qu'ils utilisent une tâche périodique.

Événement déclenché

Si votre transfert de données est déclenché par l'action de l'utilisateur, utilisez un service d'arrière-plan ou une tâche AsyncTask pour le transfert de données.

par exemple : DropBox / Evernote. Ils se synchronisent lorsque j'interagis avec l'application.

Instantané

Si votre application exécute la messagerie instantanée / e-mails / mises à jour importantes non périodiques , vous avez besoin de notifications push, car vous souhaitez alerter immédiatement l'utilisateur. Utilisez GCM ou Parse pour ce cas. par exemple: WhatsApp / chat Google. Puisque vous avez explicitement mentionné que vous ne souhaitez pas utiliser GCM, je vais vous expliquer pourquoi vous devriez utiliser un fournisseur de notification push standard au lieu d'écrire le vôtre:

Les notifications push fonctionnent instantanément - il y a très peu de retard (de l'ordre des secondes, rarement des minutes). Si vous deviez implémenter votre propre solution / bibliothèque pour ce faire - dans un modèle naïf, vous cingleriez le serveur toutes les secondes ou 5 secondes ou une minute pour vérifier l'état. Ceci est très inefficace car il consomme du CPU (et donc de la batterie), de la bande passante sur le mobile et se charge sur votre serveur. Cependant, dans GCM / Parse, ils gardent toujours un port ouvert avec le serveur (voir ici ). C'est le moyen standard et le plus efficace. De plus, si 10 applications utilisent GCM, vous n'avez pas besoin de 10 connexions ouvertes, vous n'en avez besoin que d'une par appareil. Et vous ne voulez vraiment pas développer votre propre solution à moins d'avoir une raison / des fonds / du temps valables pour le faire.

Remarque sur l'adaptateur de synchronisation : l' adaptateur de synchronisation fonctionne bien pour les trois cas ci-dessus. Cochez Exécuter un adaptateur de synchronisation et vous verrez que cela dépend soit de GCM ou de votre propre mécanisme (déclencheur d'événement ou solution personnalisée) ou de la disponibilité du réseau (déclencheur d'événement) ou d'un événement périodique. Dans l'ensemble, c'est une bonne classe pratique pour synchroniser les données sans avoir à faire une longue liste d'initialisations à chaque fois ou à implémenter tous les cas ci-dessus en un seul endroit.

Sundeep
la source
En tant que question étendue, si j'ai besoin de mettre à jour les scores en direct d'un match, le scénario instantané est-il le bon pour ce contexte? J'ai un écran contenant les détails du match et pendant que l'utilisateur est sur cet écran, les scores devraient être automatiquement mis à jour sans synchronisation ni mise à jour manuelle. Alors gcm serait-il le bon pas en avant?
gaara87
@AkashRamani Je ne vois pas pourquoi vous ne devriez pas utiliser GCM / Parse dans ce cas. Cependant, GCM est gratuit tandis que Parse vous facture au-delà d'un certain point. Si vos mises à jour sont bien dans 4096 octets, vous pouvez envoyer la mise à jour directement. Si vos mises à jour de score sont très fréquentes, le sondage pourrait être une bonne idée au lieu de GCM (par exemple, pour les scores de cricket). Je suggère de tester / profiler à la fois l'interrogation et GCM pour la latence et la consommation CPU / batterie.
Sundeep
AWS dispose également d'une solution de notification multi-plateforme et multi-marché. Voir: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin
3

Il y a un aspect d'un SyncAdapterqui n'a pas été mentionné par les autres réponses.

Le SyncAdaptermodèle requiert que vous ayez une autorité ContentProvider spécifique à laquelle vous effectuez la synchronisation et un type de compte spécifique (voir Authenticator ) qui va être synchronisé. Donc, à moins que vous n'ayez déjà ces composants dans votre architecture (par exemple, parce que vous autorisez d'autres applications à accéder à vos données ou que vous devez prendre en charge des comptes), SyncAdaptercela entraînera une surcharge de mise en œuvre importante.

Martre
la source
2

En ce qui concerne la synchronisation des données impliquant une connectivité, vous souhaitez également pouvoir évoluer. Je crois que la façon recommandée de procéder consiste à utiliser l'adaptateur de synchronisation.

Cela semble également être le cas si vous consultez le guide de formation Android: Création d'un adaptateur de synchronisation

Le composant adaptateur de synchronisation de votre application encapsule le code des tâches qui transfèrent des données entre l'appareil et un serveur. En fonction de la planification et des déclencheurs que vous fournissez dans votre application, le cadre de l'adaptateur de synchronisation exécute le code dans le composant adaptateur de synchronisation ...

moucheron
la source
2

Les adaptateurs de synchronisation doivent être utilisés sauf si vous avez besoin de données en temps réel car, il automatise le transfert de données en fonction de divers critères, tels que les modifications de données, le temps écoulé, l'heure, etc. Il centralise tous les transferts de données afin que votre transfert de données se fasse en conjonction avec les transferts de données à partir d'autres applications, ce qui réduit l'utilisation de la batterie.

Pour les tâches instantanées que nous pouvons utiliser,

AsyncTask pour les tâches de courte durée, peut durer de 3 à 4 secondes.

IntentService pour les tâches de longue durée.

Sajad Deyargaroo
la source
Grande ventilation pour les choix de règle générale.
Brill Pappin
0

Puisque nous parlons de conception, nous devons mentionner la gestion de SyncAdapters, l'objet SyncResult et ce qui se passe ensuite.

J'utilise en fait un SyncAdapter pour dire à ma bibliothèque d'effectuer des appels Web IntentService sur mon serveur. La gestion de cette opération de «synchronisation» est délicate.

Une approche que je prends maintenant est de renoncer complètement à l'objet SyncResult et d'utiliser simplement un service pour enregistrer les résultats de chaque "Sync" individuelle

Saik Caskey
la source