2011-12-09 26 views
4

我正在使用ContentObserver來偵聽聯繫人數據庫中的更改。現在我意識到onChange()方法會隨機調用,即使我沒有對聯繫人進行任何更改。我懷疑這與自動聯繫同步有關(儘管此時聯繫人沒有真正的變化)。聯繫人ContentObserver隨機調用

只有在用戶所做的聯繫人發生實質性變化時纔有可能收到通知?

THX西蒙

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

OK,因爲似乎沒有人有這個問題的答案,這是我做了什麼:

創建觀察者時,我加載所有的聯繫人導入一個緩存。然後,在每個onChange()事件中,我再次加載聯繫人並將它們與緩存的聯繫人進行比較,以查看是否存在差異。

不是最優雅的解決方案,但它的作品至少...

+0

西蒙說得對;在himanshu的評論中,更優雅(也可能是脆弱的)方法在http://mylifewithandroid.blogspot.com/2008/03/observing-content.html – kellogs