Исключение мертвых объектов Android - PullRequest
12 голосов
/ 12 августа 2011

Я успешно завершил реализацию проекта Android и начал тестировать приложение на предмет утечек памяти.Иногда я получаю исключение мертвого объекта после долгой поездки в приложении, и все выделения памяти освобождаются.Как я могу обнаружить эту проблему?Я провел некоторое исследование об инструментах DDMS для обнаружения утечек памяти. Из-за того, что я понятия не имею о DeadObjectExeption, я не знаю с чего начать.

Заранее спасибо ..

Ответы [ 2 ]

31 голосов
/ 24 ноября 2012

Это не проблема утечки памяти.Определение утечки памяти (из Википедии):

Утечка памяти в компьютерной науке (или утечка в этом контексте) возникает, когда компьютерная программа получает память, но не может освободить ее обратно воперационная система.

Здесь у вас есть противоположный случай - память освобождается раньше, чем должна (по крайней мере, с точки зрения вашей программы).

От developer.android.com:

DeadObjectException расширяет RemoteException

Объект, который вы вызываете, умер, поскольку его процесс размещения больше не существует.

Например:

У вас есть классы MyActivity и MyService.Вы используете Handler / Messenger для связи между ними.Вы создаете Обработчик и Messenger в MyActivity, а затем отправляете созданный экземпляр Messenger в MyService через Intent.Затем вы делаете что-то, проходит время, и ваша MyActivity разрушается вместе с обработчиками и мессенджерами.Теперь, если вы не справитесь с этим хорошо, MyService не будет знать, что его Messenger больше не действителен, поэтому он пытается отправить что-то через него и получить DeadObjectexception:

/* Отправить сообщение обработчику этого мессенджера.

Параметры:

message Сообщение для отправки.Обычно извлекается через Message.obtain ().

Броски:

RemoteException Бросает DeadObjectException, если целевой обработчик больше не существует. * /

public voidsend (Message message) выдает RemoteException {...}

0 голосов
/ 03 августа 2015

Если вы вызываете какую-либо функцию из Native Library (.so файл), просто проверьте, что имя пакета, использованное при создании функции JNI, совпадает с тем, как вы объявляете нативный метод в классе Java.

...