2013-04-04 58 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