Есть ли потеря производительности (или утечка памяти) при хранении виджетов в приложении?

У меня есть SlidingDrawer, на который ссылаются во всех моих действиях. Ящик довольно подробный и имеет глубокую иерархию взглядов. В настоящее время у меня есть все мои действия, вызывающие контекст приложения при создании, чтобы получить единственную копию ящика. Когда вызывается действие onPause, оно удаляет ящик из своего верхнего уровня ViewGroup. Это работает, но я не знаю, является ли это лучшим способом сделать это.

Также проблема, которую я имею, является использованием контекста. SlidingDrawer имеет несколько кнопок, которые запускают некоторые диалоги. Зная, что я не могу передать контекст приложения, я просто создал OnActivityChangeBroadcaster а также Listener который изменил контекст ссылок для ящика. Но даже с этим диалог всегда появляется в активности запуска.

У кого-нибудь есть мысли или мудрость по этому поводу?

2 ответа

Решение

Это работает, но я не знаю, является ли это лучшим способом сделать это.

У тебя утечка памяти. Никогда не передавайте виджеты между действиями. Никогда не помещайте виджеты или что-либо еще со ссылкой на действие в Application объект или статический член данных, если вы не собираетесь null эту ссылку, когда деятельность уничтожена.

У кого-нибудь есть мысли или мудрость по этому поводу?

Пересмотрите свой ящик в каждом упражнении, пожалуйста.

Мой подход заключается в том, чтобы отделить пользовательский интерфейс от данных. Если во многих ваших действиях используется один и тот же SlidingDrawer, я бы разделил данные, которые SlidingDrawer отображает, в свой собственный класс [не-UI], чтобы он существовал только в одном месте, и чтобы каждый экземпляр SlidingDrawer заполнял себя из этих данных. Вы можете определить свой SlidingDrawer в XML один раз и <include> это во всех макетах, которые вам нужны.

Тогда у меня была бы одна функция, которая заполняла бы SlidingDrawer данными из вашего отдельного класса (доступной через одноэлементный объект или путем создания данных static). Чтобы достичь этого, вы можете сделать static метод, который принимает SlidingDrawer для заполнения в качестве параметра (public static void loadSlidingDrawer(SlidingDrawer destinationView) {...}), или вы можете расширить SlidingDrawer и сделать этот метод класса доступным для каждого экземпляра.

CommonsWare верна, вы будете терять память повсюду с вашей текущей стратегией. Элементы пользовательского интерфейса должны иметь гибкость, чтобы их можно было постоянно уничтожать и воссоздавать, поэтому очень полезно привыкнуть разделять все ваши данные на не-пользовательские классы, которые пользовательский интерфейс просто отображает. Это прекрасно разделяет все и позволяет эффективно функционировать каркасу.

Другие вопросы по тегам