9

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

现在我在一个博客上读到了这些行

不要忘记注销内容观察者

所以,我无法理解如果我想注册一个,ContentObserver那么我必须取消注册的情况可能是什么。

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

这是那个博客的网址

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

4

4 回答 4

15

查看活动生命周期

活动生命周期

  • 如果您在其中注册观察者,则在其中onCreate取消注册onDestroy
  • 如果您在其中注册观察者,则在其中onStart取消注册onStop
  • 如果您在其中注册观察者,则在其中onResume取消注册onPause

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

于 2013-04-04T11:44:46.187 回答
6

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

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

一旦你取消注册这些方法之一。它不会observe有任何价值,memory leak也不会提供任何价值。

  @override

    public void onDestroy()
    {

getContentResolver().
      unregisterContentObserver(yourObserver);

    }

或者你也可以这样做

 @override

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

    }
于 2013-04-04T11:39:13.667 回答
6

想象一下,您有一个应用程序,假设有一个使用FriendListActivity. 现在要为这个活动创建 UI,您从数据库中读取数据并创建您的 UI。

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

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

现在,下次用户来到此屏幕时,您将再次获取最新数据并在数据库中注册以进行内容更改...

因此,内容观察者通常是活动和数据库(或特定 URI)之间的关系。因此,您将在Activity启动时注册它,并在活动超出视图时取消注册它..

希望这可以帮助...

于 2013-04-04T11:51:56.287 回答
3

在博客文章中,它指出:

注册内容观察者后,您也有责任取消注册。否则,您将创建内存泄漏,并且您的 Activity 将永远不会被垃圾收集。

因此,当您Activity关闭时,您应该取消注册 - 这应该在onPause方法中完成。onPause总是会被调用,每当你离开你的Activity.

查看生命周期:http Activities: //developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

于 2013-04-04T11:41:17.053 回答