为什么以及何时取消注册android中的内容观察者

时间:2013-04-04 11:36:33

标签: java android contentobserver

我正在开发一个Android应用程序,并且第一次使用内容观察者。所以我阅读了很多教程,并得到了为什么提供它以及如何使用它的概念。

现在我已在博客

上阅读了这些内容
  

别忘了取消注册内容观察员

所以,我无法理解我是否想要注册一个ContentObserver那么我可能需要取消注册的情况。

如果观察者的目的得到满足,那么它可以取消注册。但我必须观察直到用户卸载应用程序,然后我将取消注册观察者。

以下是该博客的网址

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

4 个答案:

答案 0 :(得分:14)

查看activity lifecycle

Activity lifecycle

  • 如果您在onCreate注册观察员,则在[{1}}
  • 中取消注册
  • 如果您在onDestroy注册观察员,则在[{1}}
  • 中取消注册
  • 如果您在onStart注册观察员,则在[{1}}
  • 中取消注册

由于只能同时显示一个活动,我建议使用最后一个选项。

答案 1 :(得分:6)

请阅读您提供的链接,并明确提及

您在onResume()生命周期方法中注册观察者,并在onPause()方法中取消注册。

一旦你注销了其中一个方法,它就不会observe任何值,也不会给任何memory leak

  @override

    public void onDestroy()
    {

getContentResolver().
      unregisterContentObserver(yourObserver);

    }

或者你也可以这样做

 @override

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

    }

答案 2 :(得分:5)

想象一下,你有一个应用程序可以说是使用FriendListActivity创建的朋友列表屏幕。现在,要为此活动创建UI,您可以从数据库中读取数据并创建UI。

现在假设您还有一个在后台运行的服务,并使用Web服务将该数据库与远程数据库同步。

现在,只要服务更新了数据库中的好友列表,您也需要相应地更新UI。因此,要实现此目的,您将在FriendListActivity为朋友Activity启动URI时注册内容观察者(假设知道URI的概念),以便每当数据库中的好友列表发生变化时,您还会更新FriendListActivity中的好友列表。现在,如果用户退出您的活动或关闭应用程序,那么您不需要更新UI(因此您不需要获取更改数据库的事件),因此您将取消注册内容观察者。

现在,当用户下次访问此屏幕时,您将再次获取最新数据并向DB注册以进行内容更改...

因此内容观察者通常是活动和数据库(或特定URI)之间的关系。那么你会在Activity启动时注册它,并在活动离开视图时取消注册它。

希望这会有所帮助......

答案 3 :(得分:3)

在博文中,它指出:

  

当您注册了内容观察者时,您还有责任取消注册。否则你会创建一个内存泄漏,你的Activity永远不会被垃圾收集。

因此,当您的Activity关闭时,您应取消注册 - 这应该在onPause方法中完成。只要您离开onPause,就会随时调用Activity

查看Activitieshttp://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

的生命周期