如何解决DeadObjectException问题?

15

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

有时候,在应用程序长时间运行后,我会遇到DeadObjectException,而且所有的内存分配都被释放了。

我该如何检测这个问题?

我研究了一些DDMS工具来检测内存泄漏,但由于我对DeadObjectException没有头绪,不知道从哪里开始。

2个回答

36

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

在计算机科学中,内存泄漏(或泄漏)发生在计算机程序获取内存但未将其释放回操作系统时。

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

来自developer.android.com:

DeadObjectException 扩展 RemoteException

您调用的对象已死,因为其主机进程不再存在。

例如:

你有类 MyActivity 和 MyService。你使用 Handler/Messenger 在它们之间通信。

你在 MyActivity 中创建 Handler 和 Messenger,然后通过 Intent 将创建的 Messenger 实例发送到 MyService。然后你做一些事情,时间过去了,你的 MyActivity 被销毁,它的 Handler 和 Messenger 也一并被销毁。现在,如果你处理不好,MyService 就不知道它拥有的 Messenger 不再有效,所以它试图通过它发送一些东西,并获得 DeadObjectException:

/* 向此 Messenger 的 Handler 发送消息。

Params:

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

Throws:

RemoteException如果目标 Handler 不再存在,则引发 DeadObjectException。/

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


在Android中,我知道它会发生在我的应用程序主进程和子进程之间。那么当它发生在同一进程的线程和另一个线程之间时呢? - kidoher
6
如何预防崩溃?请提出建议。 - Anand Savjani

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接