Обратный вызов Android - это потенциальная утечка памяти? - PullRequest
4 голосов
/ 08 апреля 2011

В моем приложении для Android одно из моих занятий включает в себя создание экземпляров других моих классов. Некоторые из классов нужно записать на экран. Я хочу, чтобы все взаимодействие с макетом оставалось на верхнем уровне. Итак, я создал интерфейс, который включает в себя список методов, которые можно вызывать для вывода на экран. Затем я реализую этот интерфейс в основной деятельности. Наконец, при создании экземпляров классов я передаю «this» конструктору, и он сохраняется и используется для обратных вызовов.

Мой вопрос: существует ли опасность утечки памяти из-за того, что я передал сам объект Activity в один из его объектов?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Я хотел бы изучить стандартный механизм Android-обработчика для этого (также поддерживающий пользовательские обратные вызовы для изменений пользовательского интерфейса).

Вот пример обработчика, определяющего пользовательский обратный вызов для обработки изменений пользовательского интерфейса:

http://developer.android.com/resources/samples/TicTacToeLib/src/com/example/android/tictactoe/library/GameActivity.html

Пока вы можете гарантировать, что ваше "это" правильно определено, вы должны быть в полной безопасности, однако, как только вы начинаете передавать действия другим классам, это оставляет дверь открытой для потенциальных утечек памяти, так как фрагменты кода могут теперь захватить этот экземпляр и предотвратить его сборку во время, когда сборка мусора должна была произойти на объекте.

2 голосов
/ 08 апреля 2011

Если я правильно понимаю ваш вопрос, вы абстрагировали некоторые функциональные возможности пользовательского интерфейса в класс и украсили им свою деятельность.

Простой ответ на ваш вопрос - нет. Хотя вы передаете экземпляр «this» объекту, область действия самого объекта регулируется Activity. На самом деле фреймворк Android проходит вокруг контекста, не очень похожего на то, что вы делаете. Я считаю, что мы все можем согласиться с тем, что у Activity очень ограниченный срок жизни.

Второй момент, который я хотел сделать, касается всей методологии. Android предоставляет механизм для отправки сообщений в основной поток для взаимодействия с пользовательским интерфейсом. (post или asynctask и т. д.). Вы должны использовать один из этих механизмов, чтобы внести некоторые изменения в пользовательский интерфейс (в основном потоке). Поэтому мой вопрос: не могли бы вы написать анонимный внутренний класс для выполнения этой операции с использованием asynctask, особенно если эта функциональность уникальна только для этой операции.

...