Content Observer onChange méthode appelée deux fois après 1 changement de curseur
J'ai une application dans laquelle je suis l'espoir d'envoyer les détails dans l'android liste de contacts sur un serveur distant, de sorte que l'utilisateur peut consulter ses contacts en ligne.
Pour ce faire, je veux vous informer que le serveur distant de toutes les modifications effectuées sur le téléphone à la liste de contacts.
J'ai mis en place un ContentObserver sur le ContactsContract.Les Contacts.CONTENT_URI' partir d'un service qui est lancé lorsque le téléphone est allumé.
J'ai un certain nombre de quiestions, les 2 premiers sont accessoires, la troisième est ma préoccupation majeure.
1: une Fois que j'ai mis en place un service qui enregistre un ContentObserver sur mon Curseur, n'est que l'observateur n'existent que dans le service? Je veux dire, si le service est tué, le contentObserver continuer à observer?
2: je crois que la réponse est non, mais je vais demander de toute façon. Est-il de toute façon de savoir qui contacter en cours de mise à jour est le déclenchement de la onchange méthode de mon contentObserver? actuellement, j'ai compilé la liste de tous les contacts sur le téléphone et les envoyer à mon serveur distant, il serait tellement plus simple d'envoyer les détails de contacts en cours de mise à jour.
3: C'est ma principale question, quand je fais un changement dans ma Liste de Contacts le onChange méthode est déclenché deux fois en succession rapide. 1 changement 2 appels. Est-il de toute façon de gérer cela?
public class ContactService extends Service {
JSONArray contactList;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
Log.i("C2DM","content observers initialised");
super.onCreate();
//Call Log Content Provider observer
MyContentContactsObserver contactsObserver = new MyContentContactsObserver();
ContactService.this.getContentResolver().registerContentObserver (ContactsContract.Contacts.CONTENT_URI, true, contactsObserver);
}
private class MyContentContactsObserver extends ContentObserver {
public MyContentContactsObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.i("LOG","detected change in contacts: "+selfChange);
}
}
}
Résultats en 2 rapide de lignes dans mon logCat:
detected change in contacts: false
detected change in contacts: false
source d'informationauteur Kevin Bradshaw
Vous devez vous connecter pour publier un commentaire.
j'ai fait une similaire de mise en œuvre et a mis en place un
ContentObserver
sur le calendrier des événements de laURI
. et j'ai fait face à tous les problèmes, vous êtes maintenant face. Donc, votre question avec mes solutions/suggestions ici....Non, il ne sera pas observer le contenu de votre contenu sur d'URI. mais il y a une solution à cela. vous pouvez créer un toujours en cours d'exécution du service. Ce service sera créé à nouveau dès qu'il est rejeté en raison de certaines de problème de mémoire ou d'autres imprévus licenciement. Il sera toujours continuer à s'exécuter que si elle est rejetée explicitement. Pour créer un tel service remplacer
OnStartCommand(Intent intent, int flags, final int startId)
dans votre classe de Service et de rendementSTART_STICKY
. Regardez le code ci-dessous..
Encore vous l'aviez deviné.:). la réponse est Non.
Il n'y a aucun moyen de savoir précisément lequel le contact a été mis à jour. ContentObserver, il suffit de fournir un événement pour vous faire savoir que certains changements ont été apportés aux données pointées par l'uri. Mais je pense que vous êtes face à la situation de façon inefficace, comme vous compilez une liste de tous les contacts et de les envoyer vers le serveur.
Je vous suggère de maintenir une liste de contacts, qui sont correctement envoyées au serveur, dans le local de stockage. Et la prochaine fois, quand vous recevez un appel en
onChange()
méthode decontentObserver
vous chercher touscontacts
decontent_URI
, de les comparer avec précédemment stocké à la liste et envoyer uniquement des mises à jour des contacts sur le serveur.Oui cela arrive, mais je suppose que vous êtes dans une mauvaise impression. Dans mon cas, il a utilisé pour tirer au hasard deux ou trois fois ou même plusieurs fois. donc j'avais mis un threshold_time intervalle. Un intervalle de temps dans lequel s'
ContentObserver
est déclenché à nouveau, je ne voudrais pas traiter. J'ai fait quelque chose comme ça..Espère que ces suggestions/solutions d'aide.
Examiner comment vous vous inscrivez votre observateur. Le deuxième argument de
registerContentObserver
estboolean notifyForDescendents
vous avez défini pourtrue
. ainsi, vous serez notifié lors de l', soit ContactsContract.Les Contacts.CONTENT_URI ou l'un de ses descandants uri ont été changé. Il se peut que certaines opérations pour le contact avec les id les déclencheurs de notification à la fois pour le contact spécifique uri et globale des contacts uri - le deuxième argument étanttrue
votre observateur observe à la fois.Une autre chose est que Vous pouvez enregistrer le contenu observateur de contact spécifique id uri -
ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId)
. Toutefois, cela n'a rien à voir avec votre problème, mais l'enregistrement de séparer l'observateur de chaque contact est plutôt moche 😉Une autre suggestion: Peut-être garder l'observateur champ final de ne pas la recréer dans onCreate (mais seulement enregistrer).
À venir à votre nr. 3: Combien de temps entre les deux appels de votre observation? Je pense que votre observateur est appelé à la fois en raison de la synchronisation des contacts, qui met également à jour la base de données. C'est à dire. premier temps est de votre mise à jour, la deuxième fois, c'est lors de la synchronisation terminée et registres de la synchronisation des valeurs dans la même ligne.
Pourrait vous désactivez la synchronisation et voir si il obtient toujours appelé deux fois?
vous pouvez avoir deux ou plusieurs instances de ContactService qui tous les d'entre eux sont inscrits à la même ContactsContract.Les Contacts.CONTENT_URI.
Face au même problème dans mon code et découvert que j'étais appel registerContentObserver() deux fois. Même si c'était pour exactement le même URI et dans la même classe que mon onChange(boolean selfChange) méthode a été appelée deux fois.