SyncAdapter periodicsync() déclenche pas
Je suis en train ty comprendre comment la syncAdapter travaux, j'ai utilisé le sampleSync Adaptateur comme un exemple/point de départ et j'ai fondé mon premier test. La seule différence est que je ne travaille pas avec les contacts par défaut du fournisseur, mais que j'ai besoin d'un de mes propres.
Cette méthode est un peu la même chose que dans le sampleSyncAdapter démo (en AccountAuthenticatorActivity), j'ai juste ajouté le périodique de synchronisation.
public void finishLogin(String authToken) {
Log.i(TAG, "finishLogin()");
final Account account = new Account(mUsername, "be.company.syncAdapterTest");
if(mRequestNewAccount) {
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setIsSyncable(account, MY_AUTHORITY, 1);
Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.addPeriodicSync(account, MY_AUTHORITY, params, 30);
ContentResolver.setSyncAutomatically(account, MY_AUTHORITY, true);
ContentResolver.requestSync(account,MY_AUTHORITY,params);
} else {
mAccountManager.setPassword(account, mPassword);
}
final Intent intent = new Intent();
intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, "ACCOUNT_TEST");
intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, "be.company.syncAdapterTest");
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
Dans le perfomSync() méthode que j'ai la méthode suivante:
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
Log.d(TAG, "onPerformSync() start");
//Testje
try {
final String authToken = mAccountManager.blockingGetAuthToken(account, "be.company.syncAdapterTest", NOTIFY_AUTH_FAILURE);
Log.d(TAG, SAPNetworkUtilities.getWeek(account, authToken, getRandomDate()));
} catch (OperationCanceledException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (AuthenticatorException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG, "onPerformSync() end");
}
Ici, je viens de l'appeler un simple SAP webservice et de l'afficher dans le journal. Maintenant, j'ai deux questions suivantes:
- La SYNCHRONISATION ne démarre pas automatiquement lorsque je ajouter mon Compte dans les paramètres. J'ai besoin d'aller à l'intérieur du compte et cochez la case pour démarrer la synchronisation?
- La synchronisation n'est pas triggerd toutes les 30 secondes dans cet exemple... Dois-je ajouter quelque chose dans la perfomSync() la méthode afin de laisser le système de savoir que la synchronisation est effectuée et que la prochaine course peut commencer?
En ce moment je n'écris pas de les valeurs dans le contentProvider, juste parce que je suis à essayer de comprendre comment la synchronisation fonctionne dans le détail.
Actuellement je suis en essais sur l'émulateur Android.
Merci d'avance pour vos commentaires.
Salutations,
Robin
J'ai mis un periodicSync avec la fréquence <60, et a vu un logcat message que le système avait arrondi jusqu'à 60 ans - un minimum pour ne pas mentionnés dans la documentation. Bien sûr, je ne serais pas la lecture de cette page si elle avait ensuite disparu sur la réalité de la synchronisation à tous - periodicSync ne fonctionne pas pour moi non plus, indépendamment de setIsSyncable ou stackoverflow.com/questions/7925802/...
Avez-vous trouvé une réponse à cela?
OriginalL'auteur rpan | 2013-03-26
Vous devez vous connecter pour publier un commentaire.
J'ai aussi été aux prises avec la synchronisation périodique avec la synchronisation de l'adaptateur. Je pourrais feu mon SyncAdapter manuellement avec requestSync, mais addPeriodicSync ne serait pas le feu.
J'ai remarqué que dans tous des exemples, en allant dans Paramètres->Comptes ont montré la SyncAdapter compte avec un peu de "synchronisation de la roue" (généralement de couleur verte si c'est la synchronisation fine; le rouge, si elle n'a pas de synchronisation récemment) avec une "Dernière synchronisation" timestamp. Mon compte (un compte factice copié et collé à partir du Google Docs) n'a pas eu quelque chose comme une roue de synchronisation ou d'horodatage répertoriés.
Plus exposées à creuser ce qui s'est avéré être le problème: mon fournisseur de contenu n'ont pas étiquette dans XML (je l'utilise déjà avec pas de problèmes, j'ai donc écrémé à travers la partie de la documentation). L'ajout d'une simple étiquette pour mon fournisseur de contenu causé à montrer sous mon compte dans les Paramètres, avec une synchronisation de la roue et l'horodatage.
Voici un code prises à partir de mon application pour l'inspiration. J'espère que ça aidera quelqu'un, quelque part!
/res/xml/sync_adapter.xml
/com/example/base de données/data/MySyncAdapter
AndroidManifest.xml (les BESOINS de l'Étiquette de Fournisseur de Contenu à afficher dans des Comptes à l')
MainActivity. J'ai appeler ce code après la première exécuter l'assistant de configuration, mais vous pouvez l'appeler de n'importe où. Il va tenter de synchroniser toutes les 30 secondes (utilisé pour les tests). Notez que Google Docs pour ce sont actuellement mal, qu'il mentionne qu'il veut millisecondes au lieu de secondes. Une autre chose à noter est que vous ne pouvez pas passer la valeur null dans un bundle. Cela permettra de jeter une IllegalArgumentException ou quelque chose de similaire.
Il est possible qu'il fonctionne sans étiquette et, si cela fonctionne pour vous, je ne serais pas réparer ce qui n'est pas cassé. Je travaillais avec un ensemble spécifique de Samsung tablettes Android et c'est ce qui semblait le faire fonctionner.
Il est cassé sur certaines tablettes du client. Ce sont des Samsung Galaxy Note 10.1 sous Android 4.1.2. Wil mise à jour de ces comprimés à 4,4 aider?
Désolé pour le retard. Je sais que les travaux ci-dessus avec de nombreux modèles de Samsung fonctionnant 4.4 et je l'ai testé avec succès sur au moins un modèle avec 4.3. J'ai été capable d'aller aussi loin que de 4,2, mais la plupart des composants de mon application nécessaires Jelly Bean ou plus, donc je n'ai pas aller plus bas.
Mon problème s'est avéré n'ont rien à voir avec Samsung des choses spécifiques. C'était une (bête) erreur de ma propre. J'ai cherché pendant des comptes, mais ne vérifie pas le type, ainsi, sur certains aléatoire tablettes, je suis un non-compte google. Voir stackoverflow.com/q/31290783/2072569.
OriginalL'auteur welshk91
Périodique de Synchronisation ne déclenche pas sur certains appareils, si l'option de synchronisation n'est pas définie. Je suis fou de ce problème avec un Samsung Galaxy Grand 2 récemment...
un million de mercis
OriginalL'auteur Martin Alcubierre Arenillas
J'ai juste cogné la tête contre un mur pendant des heures à essayer de comprendre pourquoi périodique de synchronisation ne fonctionnait pas. Il s'avère que la fréquence de sondage des besoins en secondes (littérale) de ne pas millisecondes, et pas les secondes en millisecondes. Ainsi, par exemple, si vous souhaitez synchroniser toutes les minutes et demie, vous devez appeler:
Aussi, le bundle passé ne peut pas être null comme il est dans la documentation, il va lever une exception NullPointerException.
OriginalL'auteur Matt Kranzler
Un périodique de synchronisation ne peut être exécuté que si son auto-sync est SUR et c'est syncable=true. Une meilleure approche de ce problème est d'utiliser GCM. Le serveur peut envoyer des notifications push à l'appareil(s) à chaque fois qu'il y a un changement, le client a besoin de savoir. Sur le client, nous demande une synchronisation manuellement lors de la réception d'un tel message. Il est plus économe en énergie et nous avons mis à jour dès que notre serveur est, sans attendre le prochain cycle de synchronisation.
OriginalL'auteur Hisham
Périodique de la synchronisation ne fonctionnera pas si le périphérique de stockage interne est presque plein, même si la synchronisation de tous vos configurations sont définies dans le droit chemin.Je pense que la synchronisation va cesser de fonctionner si 96 ou 97% de la mémoire est utilisée.Je ne sais pas qui est à leur disposition à le faire fonctionner, même si la mémoire est presque pleine.
Vous pouvez observer le même problème dans l'application gmail sur android mobile, où la synchronisation ne fonctionnera pas lorsque la mémoire est presque pleine.Vous ne pouvez pas recevoir ou envoyer de message à l'aide d'android application gmail lorsque la mémoire de l'appareil est presque plein.
OriginalL'auteur KJEjava48
Celui-ci fonctionne très bien pour moi
Il y a deux erreurs dans le guide de formation aussi loin que de vous expliquer comment faire addPeriodicSync travail:
Vous devez appeler ContentResolver.setSyncAutomatically avec vrai que le troisième (sync) paramètre pour activer la synchronisation pour votre adaptateur avant de addPeriodicSync.
comme ceci :
ContentResolver.setSyncAutomatically(compte,MY_AUTHORITY,true);
La quatrième (pollFrequency) paramètre de ContentResolver.addPeriodicSync est un nombre de secondes, comme indiqué ici, et pas millisecondes, implicite dans le guide de formation. Le code de démonstration pour addPeriodicSync dans le guide de formation sera la cause d'une synchronisation une fois tous les mille heures au lieu de une fois par heure. Donc, la fréquence minimale est de 1 minute.
Reportez-vous À cette http://digitalassassin.net/2014/03/contentresolver-addperiodicsync-doesnt-work-never-syncs/
OriginalL'auteur Abhishek Singh