如何解决 DeadObjectException 问题?

发布于 2024-11-29 00:07:56 字数 213 浏览 1 评论 0原文

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

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

我怎样才能检测到这个问题?

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

I have successfully finished an Android project's implementation and started to test the app for memory leaks.

Sometimes, I get DeadObjectExceptionafter a long trip in the app and all of the memory allocations are freed.

How can I detect this problem?

I have made some research about DDMS tools to detect memory leaks, Due to I have no idea about DeadObjectExeption, I don't know where to start.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゃ人海孤独症 2024-12-06 00:07:56

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

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

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

来自developer.android.com:

DeadObjectException 扩展了 RemoteException

您正在调用的对象已死亡,因为其托管进程不再存在。

例如:

您有类 MyActivity 和 <代码>我的服务。您使用 Handler/Messenger 在它们之间进行通信。

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

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

参数:

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

抛出:

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

public void send(Message message) 抛出 RemoteException {...}

This is not a memory leak problem. Definition of the memory leak (from Wikipedia):

A memory leak, in computer science (or leakage, in this context),
occurs when a computer program acquires memory but fails to release it
back to the operating system.

Here, you have an opposite case - memory is freed before it should (at least from your program's point of view).

From developer.android.com:

DeadObjectException extends RemoteException

The object you are calling has died, because its hosting process no longer exists.

For example:

You have the classes MyActivity and MyService. You use Handler/Messenger to communicate between them.

You create Handler and Messenger in MyActivity, and then send created instance of Messenger to MyService via an Intent. Then you do some stuff, time passes, and your MyActivity gets destroyed, together with it's Handler and Messenger. Now, if you don't handle that well, MyService won't know that Messenger that he has is not valid any more, so, he tries to send something through it, and get DeadObjectexception:

/*
Send a Message to this Messenger's Handler.

Parameters:

message The Message to send. Usually retrieved through Message.obtain().

Throws:

RemoteException Throws DeadObjectException if the target Handler no longer exists.*/

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

柏林苍穹下 2024-12-06 00:07:56

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

If You are calling any function from Native Library(.so file), Just check the package name used while creating JNI function is same as you are declaring native method in Java class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文