2014-04-12 86 views
2

我的應用程序有一個ContentObserver來檢查聯繫人編輯時,我已經用下面的代碼實現它,它可以在Android 17以上但不是17以上的設備上運行。ContentObserver不會通知上面的API 17

observer = new MyContentObserver(); 
getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, observer); 


private class MyContentObserver extends ContentObserver 
{ 
    public MyContentObserver() 
    { 
     super(null); 
    } 

    @Override 
    public void onChange(boolean selfChange) 
    { 
     super.onChange(selfChange); 
     cache.clearCache(); 
    } 
} 
+0

請發佈'MyContentObserver'類。 –

+0

我編輯了我的文章並添加了MyContentObserver類。它適用於我的API 16手機,但不適用於具有較新API的手機。我通常使用System.out.println來檢查是否觸發了onChange。 – edoniti

回答

1

我相信問題是較新的API級別利用onChange()方法,該方法採用兩個參數的過載:一個booleanUri。試着改變你的代碼如下:

private class MyContentObserver extends ContentObserver 
{ 
    public MyContentObserver() 
    { 
     super(null); 
    } 

    @Override 
    public void onChange(boolean selfChange) 
    { 
     onChange(selfChange, null); 
    } 

    @Override 
    public void onChange(boolean selfChange, Uri uri) 
    { 
     cache.clearCache(); 
    } 
} 

你可以打電話直接兩種方法cache.clearCache();,但這樣一來會允許任何可能的未來的修改只在一個地方進行。而且,對super.onChange()的調用也是不必要的,因爲重寫的方法在超類中是空的。

+0

這可行,但還有另一個問題。當用戶點擊後退按鈕並且我的應用程序被銷燬時,內容觀察者也被銷燬。我需要contentobserver每次都活着,並在編輯聯繫人時清除緩存,以便在ListView中顯示聯繫人的更新圖像。這會消耗多少內存,並且有沒有其他方法可以用聯繫人照片更新列表視圖。 – edoniti

+0

你需要爲此發佈一個新問題。但只是爲了讓你瞭解在這個問題上需要提供的信息:通過「每次活着」,你的意思是不斷運行?這是「緩存」你的應用程序中的對象?如果您的ListView僅在您的應用程序運行時顯示,爲什麼不在啓動時更新,並且在運行時期間進行了Observer監視?如果你真的需要這個觀察者不斷運行,你需要一個服務。但我認爲應用程序啓動時更新應該足夠了。 –

+0

感謝您的快速響應。 「緩存」是一個對象「DiskLruImageCache」,它保存聯繫人的圖像。在數據庫中,我有一些電話號碼,如果該電話號碼在該電話上註冊,則我可以從中獲得名稱和圖像。然後在我的列表視圖中,我顯示這些聯繫人的姓名,號碼和圖像。如果我不使用緩存滾動確實很慢。出於這個原因,我只想在編輯手機上的聯繫人時緩存圖像並清除緩存。但是,當我的應用程序被破壞,所以它是我的內容服務器,所以它不會通知我的應用程序清除緩存。 – edoniti