Подтвердить что ты не робот

Как исправить проблему с DeadObjectException?

Я успешно завершил реализацию проекта Android и начал тестировать приложение на предмет утечек памяти.

Иногда я получаю DeadObjectException после долгой поездки в приложении, и все выделения памяти освобождаются.

Как я могу обнаружить эту проблему?

Я провел некоторое исследование об инструментах DDMS для обнаружения утечек памяти. Поскольку я понятия не имею о DeadObjectExeption, я не знаю, с чего начать.

4b9b3361

Ответ 1

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

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

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

С сайта developer.android.com:

DeadObjectException расширяет RemoteException

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

Например:

У вас есть классы MyActivity и MyService. Вы используете Handler/Messenger для связи между ними.

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

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

Parameters:

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

Throws:

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

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

Ответ 2

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