【问题标题】:ChooserActivity has leaked IntentReceiverChooserActivity 泄露了 IntentReceiver
【发布时间】:2012-07-03 17:28:54
【问题描述】:
E/ActivityThread(  655): Activity com.android.internal.app.ChooserActivity has
leaked IntentReceiver com.android.internal.app.ResolverActivity$1@412f4f38 
that was originally registered here. 

Are you missing a call to unregisterReceiver()? E/ActivityThread(  655): 
android.app.IntentReceiverLeaked: 
Activity com.android.internal.app.ChooserActivity has leaked IntentReceiver 
com.android.internal.app.ResolverActivity$1@412f4f38 that was originally 
registered here. Are you missing a call to unregisterReceiver()?
  1. 这个错误是什么意思?
  2. 既然应用程序继续工作,我应该忽略它吗?
  3. 我该如何解决?

当我按照here 发布的例程从手机图库中选择图像时会发生这种情况。 正是当我按下 Activity 布局中定义的 Browse Gallery Button 时。


完整的 LOGCAT:

E/ActivityThread(  655):    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
E/ActivityThread(  655):    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
E/ActivityThread(  655):    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
E/ActivityThread(  655):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
E/ActivityThread(  655):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
E/ActivityThread(  655):    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
E/ActivityThread(  655):    at com.android.internal.content.PackageMonitor.register(PackageMonitor.java:65)
E/ActivityThread(  655):    at com.android.internal.app.ResolverActivity.onCreate(ResolverActivity.java:99)
E/ActivityThread(  655):    at com.android.internal.app.ChooserActivity.onCreate(ChooserActivity.java:53)
E/ActivityThread(  655):    at android.app.Activity.performCreate(Activity.java:4465)
E/ActivityThread(  655):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/ActivityThread(  655):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/ActivityThread(  655):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/ActivityThread(  655):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/ActivityThread(  655):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/ActivityThread(  655):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/ActivityThread(  655):    at android.os.Looper.loop(Looper.java:137)
E/ActivityThread(  655):    at android.app.ActivityThread.main(ActivityThread.java:4424)
E/ActivityThread(  655):    at java.lang.reflect.Method.invokeNative(Native Method)
E/ActivityThread(  655):    at java.lang.reflect.Method.invoke(Method.java:511)
E/ActivityThread(  655):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/ActivityThread(  655):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/ActivityThread(  655):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android debugging android-activity memory-leaks


    【解决方案1】:

    我知道这是较旧的,但我遇到了同样的问题,并认为我偶然发现了答案,尽管这很奇怪。

    在模拟器中,如果您执行某些操作以导致应用程序选择器(例如共享意图)或选择图库应用程序,那么它似乎只有在只有一个应用程序的情况下才会出现异常,并且在您不选择一个应用程序的情况下自动加载该应用程序。

    例如,您想选择一张图片。如果您运行例程来选择图像,您很可能会在手机的选择器对话框中出现一些选择。但是在模拟器上,除了默认的 Gallery 应用程序之外,您几乎没有其他任何东西。

    当它只有一个应用程序并加载时,你会得到一个异常。

    如果您有多个应用程序可供选择,则不会出现异常。

    如果您想共享一个文本文件,也会发生同样的事情。在模拟器上,文本文件会直接自动加载一个消息应用程序,你会得到一个异常。

    如果您设置了电子邮件应用程序,它将在选择器中显示两个应用程序。你不会有任何例外。

    我相信您可以放心地忽略它,因为它似乎是内部错误消息。

    您可以尝试通过安装第二个图库应用程序来重现此问题,以查看它不会创建错误消息。

    我刚刚注意到这也描述了相同的建议https://stackoverflow.com/a/10290486/935779

    如果你真的想避免这个异常,它有一个更复杂的解决方法。

    【讨论】:

    • 柯克感谢您回答老问题,我认为它总是受欢迎的!如果您有兴趣,我会尽力让您知道更多详细信息!干杯...
    【解决方案2】:

    这是关于生命周期的。

    表示你在某处注册了IntentReceiver 但它未能在您的应用程序被暂停之前取消注册 安卓。

    您应该在onPause 方法中注销接收器并在onRestart 中重新注册接收器。所以重写这些方法并按照我的意思去做。

    【讨论】:

      【解决方案3】:

      此错误似乎是由 Android 源代码中的错误引起的,因为我从未在我的中注册过 Intent Receiver

      您也可以查看此 SO 问题以获取详细信息 Why does Intent.createChooser() need a BroadcastReceiver and how to implement?

      它明确表示ResolverActivity 注册了BroadcastReceiver,但并不总是取消注册。

      此外:

      Intent.createChooser() 将启动一个 ResolverActivity。在 onCreate() 中, 活动调用

      mPackageMonitor.register(this, false);
      

      mPackageMonitor 是一个 BroadcastReceiver 并且在 register() 内 在活动上注册自己。通常情况下,接收器是 在onStop() 中未注册。但是,稍后在onCreate() 代码中 检查用户可以选择多少个选项。如果只有一个 它调用finish()。由于finish()onCreate() 中被调用 其他生命周期方法永远不会被调用,它会直接跳转到 onDestroy() - 泄漏接收器。

      但我不知道该错误是否已修复,也许有人可以提供有关它的更多信息?

      【讨论】:

        【解决方案4】:

        如果您正在阅读这篇文章并在仅返回一个可供选择器使用的应用程序时收到此错误,则很可能是 Android 错误。 here 提出了一个问题。

        通过阅读其他报告,似乎没有什么可以做的......

        【讨论】:

          【解决方案5】:

          我不是 100% 确定,但如果它工作正常并引发异常,您可能不需要对此采取任何措施。这可能是您设备的问题,例如,供应商 Android 操作系统自定义错误。尝试在模拟器上测试它,如果它不会抛出异常,就让它保持原样。我认为你的代码很好。

          【讨论】:

            猜你喜欢
            • 2012-04-04
            • 2018-01-26
            • 1970-01-01
            • 2018-11-15
            • 2012-10-18
            • 2021-04-06
            • 2018-10-29
            • 1970-01-01
            相关资源
            最近更新 更多