联系人 ContentObserver 随机调用

Posted

技术标签:

【中文标题】联系人 ContentObserver 随机调用【英文标题】:Contacts ContentObserver called randomly 【发布时间】:2012-01-17 03:28:13 【问题描述】:

我正在使用 ContentObserver 来监听联系人数据库中的更改。现在我意识到 onChange() 方法会被随机调用,即使我没有对联系人进行任何更改。我怀疑这在某种程度上与自动联系人同步有关(即使此时联系人没有真正的变化)。

是否有可能仅在用户对联系人进行实际更改时才收到通知?

谢谢西蒙

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();


【问题讨论】:

【参考方案1】:

好的,因为似乎没有人知道这个问题的答案,这就是我所做的:

创建观察者时,我将所有联系人加载到缓存中。然后,在每个 onChange() 事件中,我再次加载联系人并将它们与缓存的联系人进行比较,看看是否存在差异。

不是最优雅的解决方案,但至少可以工作......

【讨论】:

西蒙说得对; himanshu 的评论和mylifewithandroid.blogspot.com/2008/03/observing-content.html

以上是关于联系人 ContentObserver 随机调用的主要内容,如果未能解决你的问题,请参考以下文章

用于监听联系人变化的 ContentObserver

有没有一种简单的方法可以知道在将 ContentObserver 用于 android 联系人时更改了哪个联系人?

Android ContentProviderContentResolver和ContentObserver的使用

为啥 ContentObserver 会被多次调用?

即使没有更改联系人,也会调用内容观察者

如何监听联系人数据库的变化