我正在使用ContentObserver来监听联系人数据库中的更改.现在我意识到onChange()方法被随机调用,即使我没有对联系人做任何更改.我怀疑这与自动联系人同步有关(即使此时联系人没有真正的变化).
thx simon
public class ContactsObserver extends ContentObserver { private final static String TAG = ContactsObserver.class.getSimpleName(); private Context ctx; private List<Contactschangelistener> listeners = new ArrayList<Contactschangelistener>(); private ContactsObserver(Context ctx) { super(new Handler()); this.ctx = ctx.getApplicationContext(); ctx.getContentResolver() .registerContentObserver( ContactsContract.Contacts.CONTENT_URI,// uri false,// notifyForDescendents this); // observer } @Override public void onChange(boolean selfChange) { Log.i(TAG,"Contacs change"); for(Contactschangelistener l : listeners){ l.onContactsChange(); } } @Override public boolean deliverSelfNotifications() { return false; // set to true does not change anything... } public static ContactsObserver register(Context ctx){ Log.d(TAG,"register"); return new ContactsObserver(ctx); } public void unregister(){ Log.d(TAG,"unregister"); ctx.getContentResolver().unregisterContentObserver(this); } public void addContactschangelistener(Contactschangelistener l){ listeners.add(l); } public interface Contactschangelistener{ void onContactsChange(); } }
解决方法
好吧,因为似乎没有人对这个问题有答案,这就是我所做的:
在创建观察者时,我将所有联系人加载到缓存中.然后,在每个onChange()事件中,我再次加载联系人并将它们与缓存的联系人进行比较,以查看是否存在差异.
不是最优雅的解决方案,但它起码至少……