8
votes

Android SyncAdapter Rappel

J'ai mis en place un Syncadapter, un compte de compte et un contenu privé dans le cadre du projet SimpleSynCadapter Sample dans le SDK. Tout fonctionne bien.

Maintenant, je souhaite afficher un message à l'utilisateur lorsque de nouvelles lignes ont été téléchargées à partir du serveur distant disposant d'un drapeau spécifique. J'ai besoin d'un rappel de la synchronisation lorsque une synchronisation est terminée afin que je puisse faire la requête et afficher le message d'une activité. J'ai vu quelques questions sur Stackoverflow en discutant de cela, mais aucune avec une bonne réponse.

Comment écoutera-t-on la progression de l'Android Syncadapter? < / a> dit que le syncstatusobserver est inutile. L'utilisateur Mobibob suggère d'utiliser une résoltréceur pour répondre à l'interface utilisateur du fil de synchronisation.

Comment savoir quand Sync est terminé? suggère d'utiliser un Intention de votre synckservice.

Comment signaler la synchronisation de la synchronisation à l'Android SyncManager? suggère d'utiliser le SyncResult. L'exemple de code relié par Maxpower47 utilise la classe SyncResult pour signaler des exceptions mais ne pas déclarer si une synchronisation a été complétée avec succès.

Je ne sais tout simplement pas quelle est la meilleure option et je n'ai vu aucun exemple de projets dans lesquels aucune de ces solutions est utilisée.


1 commentaires

Dans exactement la même position - avez-vous réussi à le faire quitter?


3 Réponses :


2
votes

Je sais que c'est une vieille question, mais je posais la même chose moi-même. Ce que j'ai découvert comme une bonne solution, spécialement parce que je traite de données locales comme vous, est d'utiliser la méthode suivante à partir de contenuResolver: xxx

Ceci enregistre une classe d'observateurs qui obtiennent le rappel lorsque des données identifiées par une modification de l'URI de contenu donné. Mais cela ne peut se produire que si votre fournisseur de contenu envoie la notification. Ainsi, par exemple, si vous souhaitez vous être averti sur le conteneur ci-dessus pour toutes les mises à jour effectuées sur votre base de données via un contenuProvider, votre fichier de contenu doit implémenter la mise à jour similaire à celle-ci: xxx

Utilisation NotifyFordrescendents Lorsque vous faites un registreContentobServer peut être très utile.


0 commentaires

1
votes

C'est une question ancienne mais j'ai fait des recherches au cours des jours et il n'y a pas beaucoup d'exemples sur les demandes de réseau de traitement de synchronisation et en avertissant l'interface utilisateur.

Tout d'abord, vous devez utiliser des chargeurs avec ContentProvider pour vous faciliter la vie. Vous n'avez plus besoin de vous inscrire au résolveur de contenu, le chargeur le fait pour vous. Cela signifie donc que votre interface utilisateur est notifiée pour tout ce qui passe dans votre fournisseur de contenu.

Et si rien n'a changé? Tout était à jour ou vous avez eu une erreur réseau.

  1. Vous pouvez écouter le statut de votre synchronisation comme Google I / O app fait, recherchez Msyncstatusobserver dans NotionsActivity
  2. J'ai consulté l'application email Android par défaut et utilise un Singleton avec rappels.
  3. Vous pouvez diffuser des diffusions ou utiliser un événementBus (Square Otto pour Exemple) pour informer votre interface utilisateur de tout comportement.

    J'aime mieux le dernier parce que cela vous donne plus de granularité sur les événements qui se produisent dans la synchronisation.


3 commentaires

Avez-vous des exemples d'utiliser Otto avec un synchronisation?


Désolé je n'en ai pas actuellement, j'ai un exemple de projet où dans le synchelper.java en plus Pour attraper les erreurs, vous pouvez envoyer des erreurs d'événements. Sur le côté de l'interface utilisateur, il s'agit d'une manipulation régulière des événements.


Sébastien brillant !! +1



-2
votes

Nous avons rencontré une situation similaire et avons écrit une interface d'auditeur statique à la synchronisation. L'auditeur est l'activité et effectue les actions nécessaires lorsque les données sont disponibles (Update UI). Cela fonctionne également lorsque l'adaptateur synchronisé est appelé par le système lors de l'autosync où cet auditeur serait NULL et que le processus de synchronisation vous dérangerait sa propre entreprise.

class SyncAdapter extends AbstractThreadedSyncAdapter {

    protected static Listener uiListener = null;
    public interface Listener {
        public void onSync();
    }
    public static void setListener(Listener l) {
        uiListener = l;
    }
    public static void clearListener() {
        uiListener = null;
    }
    protected void broadcastSync() {
        if (uiListener != null)
            uiListener.onSync();
    }
    public void onPerformSync(Account account, Bundle extras, String authority,
                          ContentProviderClient provider, SyncResult syncResult) {

         // call broadcastSync();
    }


0 commentaires