2013-04-04 62 views
5

我正在開發一個android應用程序,並首次與內容觀察員一起工作。所以我讀了很多教程,並得到了爲什麼提供和如何使用的概念。爲什麼以及何時註銷內容觀察員android

現在我已經閱讀了博客這些線路是

不要忘記註銷內容觀察家

所以,我無法理解,如果我想註冊一個ContentObserver那麼什麼情況是我必須取消註冊的情況。

如果觀察者的目的得到滿足,那麼它就可以了,我們可以取消註冊。但是我必須觀察,直到用戶卸載應用程序,然後爲什麼我要註銷觀察者。

這裏是博客的網址

http://www.grokkingandroid.com/use-contentobserver-to-listen-to-changes/

回答

4

想象一下,您有一個應用程序可以讓我們說一個使用FriendListActivity創建的朋友列表屏幕。現在爲此活動創建UI,您可以從數據庫讀取數據並創建您的用戶界面。

現在想象你還有一個服務在後臺運行,並使用Web服務將此數據庫與遠程數據庫同步。

現在,無論何時服務更新數據庫中的好友列表,您也希望相應地更新您的用戶界面。因此,要實現這一目標,您需要在Activity的朋友URI(假設知道URI的概念)時爲您的FriendListActivity註冊內容觀察員,以便每當數據庫中的好友列表發生更改時,您還將更新FriendListActivity中的朋友列表。現在,如果用戶移出活動或關閉應用程序,那麼您不需要更新您的用戶界面(因此您不需要獲取用於更改數據庫的事件),因此您將取消註冊內容觀察員。

現在,下一次用戶來到這個畫面,你會再次獲取的最新數據,並與數據庫登記內容發生變化......

所以內容觀察者通常的活動和數據庫之間的關係(或特定的URI)。所以當Activity被推出,你會註冊並在活動走出鑑於註銷吧..

希望這有助於...

+0

主席先生,謝謝你對我的精彩解釋+1。 – 2013-04-26 06:44:03

6

請閱讀您還提供了一個鏈接,在明確提及

你在的onResume註冊您的觀察者()的生命週期方法,你在onPause()方法中註銷它。

一旦你註銷它,這些方法的一個。它不會observe任何值,也不會給任何memory leak也。

@override 

    public void onDestroy() 
    { 

getContentResolver(). 
     unregisterContentObserver(yourObserver); 

    } 

,或者你可以做到這一點也

@override 

    public void onPause() 
    { 
    getContentResolver(). 
    unregisterContentObserver(yourObserver); 

    } 
+0

要取消註冊這取決於你。 – Unknown 2013-04-04 11:49:54

2

在博客文章,它指出:

如果您已經註冊了內容的觀察者,這是你的責任,同時註銷其。否則,你會創建一個內存泄漏,你的Activity永遠不會被垃圾收集。

因此,當您的Activity已關閉時,您應取消註冊 - 此操作應在方法中完成。 將永遠被稱爲,每當你離開你的Activity

退房的生命週期Activitieshttp://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

9

看一看的activity lifecycle

Activity lifecycle

  • 如果您註冊一個觀察員onCreateonDestroy
  • 註銷如果您在onStart中註冊一個觀察員,您在註銷
  • 如果您在onResume註冊一個觀察者,你在

註銷由於只有一個活動可以在同一時間顯示,我會建議使用最後一個選項。

+0

這是我正在尋找的答案!精緻而簡潔,準確地處理多種情況! – YoungCoconutCode 2016-01-06 15:31:02