web-dev-qa-db-fra.com

Conception pour la synchronisation des données dans Android

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?

23
Rasmus

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.

12
Simon Zettervall

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 m'informent une fois par jour (vers 18h30). Je pense 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/mails/mises à jour importantes non périodiques , vous avez besoin de notifications Push, car vous voulez 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 voulez 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. Vérifiez Exécution d'un adaptateur de synchronisation et vous verrez que cela dépend 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.

18
Sundeep

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

Le modèle SyncAdapter requiert que vous disposiez d'une autorité ContentProvider spécifique à laquelle vous effectuez la synchronisation et d'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), un SyncAdapter entraînera une surcharge d'implémentation importante.

3
Marten

Sync Adapters doit être utilisé 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 le transfert de données est effectué conjointement 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 être de 3 à 4 secondes.

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

2
Sajad Deyargaroo

En ce qui concerne la synchronisation des données impliquant la 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 Android guide de formation: 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, la structure de l'adaptateur de synchronisation exécute le code dans le composant adaptateur de synchronisation ...

2
user86794

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

0
Saik Caskey