【问题标题】:How to fix problem with DeadObjectException?如何解决 DeadObjectException 的问题?
【发布时间】:2011-10-25 14:39:42
【问题描述】:

我已经成功完成了一个 Android 项目的实现,并开始测试应用程序的内存泄漏。

有时,我在应用程序中长途旅行后收到DeadObjectException,并且所有内存分配都被释放。

我怎样才能发现这个问题?

我对检测内存泄漏的 DDMS 工具进行了一些研究,由于我不知道 DeadObjectExeption,我不知道从哪里开始。

【问题讨论】:

    标签: android memory-leaks ddms


    【解决方案1】:

    这不是内存泄漏问题。内存泄漏的定义(来自维基百科):

    计算机科学中的内存泄漏(或在此上下文中的泄漏), 当计算机程序获取内存但未能释放它时发生 回到操作系统。

    在这里,你有一个相反的情况 - 内存在它应该释放之前被释放(至少从你的程序的角度来看)。

    来自 developer.android.com:

    DeadObjectException 扩展 RemoteException

    你调用的对象已经死掉,因为它的宿主进程已经不存在了。

    例如:

    您有 MyActivityMyService 类。你使用Handler/Messenger在它们之间进行通信。

    您在MyActivity 中创建HandlerMessenger,然后通过Intent 将创建的Messenger 实例发送到MyService。然后你做一些事情,时间过去了,你的MyActivity 连同它的HandlerMessenger 一起被销毁。现在,如果你处理不好,MyService 不会知道他拥有的Messenger 不再有效,所以,他试图通过它发送一些东西,并得到DeadObjectexception

    /* 向该 Messenger 的处理程序发送消息。

    参数:

    message 要发送的消息。通常通过 Message.obtain() 获取。

    投掷:

    RemoteException 如果目标处理程序不再存在,则抛出 DeadObjectException。*/

    public void send(Message message) throws RemoteException {...}

    【讨论】:

    • 在android中,我知道它会发生在我的应用程序主进程和子进程之间。当它发生在同一进程中的一个线程和另一个线程之间时呢?
    • 如何防止崩溃?请提出建议。
    【解决方案2】:

    如果您从 Native Library(.so 文件)调用任何函数,只需检查创建 JNI 函数时使用的包名称是否与您在 Java 类中声明本地方法相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2019-01-30
      • 2019-09-21
      • 2021-09-10
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多