2011-12-09 4 views
4

저는 ContentObserver를 사용하여 연락처 데이터베이스의 변경 사항을 수신 대기 중입니다. 지금 나는 onChange() 메소드가 무작위로 호출된다는 것을 알았다. 나는 이것이 자동 접촉 동기화와 어떻게 든 관련이 있다고 생각한다 (비록이 시점에서 접촉에 실제적인 변화가 없다고하더라도).연락처 ContentObserver가 임의로 호출 됨

사용자가 만든 연락처에 실제 변경 사항이있는 경우에만 알림을받을 수 있습니까?

들으 사이먼

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() 이벤트에서 연락처를 다시로드하고 캐시 된 것과 비교하여 차이가 있는지 확인합니다.

가장 세련된 솔루션이 아니지만 적어도 작동합니다 ...

+0

사이먼은 올바르게 말합니다. 더 우아한 (그리고 아마도 허약 한) 방법은 himanshu의 코멘트와 그 대답은 http://mylifewithandroid.blogspot.com/2008/03/observing-content.html에있다. – kellogs

관련 문제