Хорошо.Судя по тому, что вы говорите и что вы показываете, кажется, что вы сохраняете экземпляры некоторых сгенерированных представлений в Singleton.Не.Каждое представление требует, чтобы контекст создавался либо с помощью кода, либо с помощью инфляции (который в основном представляет собой основанный на XML метод фабрики на основе отражений), чтобы получить доступ к ресурсам приложения и системы и сохранить ссылку на указанный контекст, так какпока они живутВ вашем сценарии это означает сохранение ссылок на действие, в котором вы создали представление.Обычно, что касается представлений и действий, вот что происходит с GC: * 1001 *
GC: Hey! Does anybody need this... MainActivity class?
View: I do! I do! I have a reference!
GC: Okay... and besides MainActivity, Does anybody else need this View class?
-Nobody answers-
GC: It does not matter my friend, you are being collected as well. Come with me.
And they both go.
В вашем случае:
GC: Hey! Does anybody need this... MainActivity class?
View: I do! I do! I have a reference! and MainActivity references me as well.
GC: Okay... and besides MainActivity, Does anybody else need this View class?
ScreenProvider: I do.
GC: Okay, keep moving View, and take MainActivity with you. Let me know when you folks are done so I can collect you.
And thus the leak.
Чтобы передать представление из одного действия в другое, выпотребуется удалить ссылку (поле mContext) на предыдущее действие.Поскольку для этого нет API, вам нужно использовать рефлексию.И возникает еще одна проблема: каждый элемент пользовательского интерфейса является подклассом View.Макеты, виджеты и т. Д., И т. Д. Таким образом, либо вы сохраняете ссылку на каждый фрагмент вашего XML-файла, чтобы удалить контекст с помощью отражения, либо вы просматриваете дочерний список представления, удаляете контекст и продолжаете, пока не появитсянет больше дочерних взглядов, на любом уровне.После этого вам нужно будет установить ссылку на новое действие таким же образом.Это звучит как огромный взлом, потому что это так, и вещи обязательно сломаются на каком-то уровне.В конце концов, Контекст представляет среду и состояние в вашем представлении.
Лучшим решением для вашей ситуации является удаление ссылок на представления из одиночного набора и использование его только для сохранения представлений о состоянии / конфигурации объекта.данный взгляд.Создайте метод обратного вызова с поддержкой (или аналогичный), который раздувает представление в фоновом режиме и выполняет необходимые конфигурации перед возвратом указанного представления.Если вы все еще хотите сохранить один репозиторий всех экранов, которые может иметь действие, добавьте его в класс действия в качестве члена, чтобы он собирался вместе с действием.
В качестве примечания, ваша ситуация предполагаетВы должны использовать одно действие, а затем просто поменять «MainScreen», состоящий из «Screens», или просто переключаться между экранами в зависимости от ситуации.Это имело бы больше смысла и было бы менее рискованным.
Наконец, цитируя себя: Помните первое правило клуба бойцов андроидов