Утечка экземпляра android.widget.LinearLayout

У меня есть два действия: QuestionnaireSelectionActivity и QuestionnaireMainActivity. QuestionnaireMainActivity запускается с намерением QuestionnaireSelectionActivity. QuestionnaireMainActivity показывает последовательность фрагментов.

Когда я пытаюсь вернуться к QuestionnaireSelectionActivity из QuestionnaireMainActivity, нажав кнопку возврата, LeakCanary сообщает об утечке.

Ни одно из этих двух действий никоим образом не ссылается на другое (кроме намерения). Я установил для всех ссылок на представления и т. Д. Значение null, когда фрагмент уничтожен и внутренние классы отсутствуют.

У QuestionnaireSelectionActivity есть LinearLayout, но я не понимаю, как он может быть вовлечен в эту проблему. В моем коде я не ссылался ни на один LinearLayout.

Может ли кто-нибудь помочь мне понять, как утекает моя активность?

Ниже представлен отчет LeakCanary:

│ GC Root: System class
│
├─ android.view.WindowManagerGlobal class
│    Leaking: NO (a class is never leaking)
│    ↓ static WindowManagerGlobal.sDefaultWindowManager
│                                 ~~~~~~~~~~~~~~~~~~~~~
├─ android.view.WindowManagerGlobal instance
│    Leaking: UNKNOWN
│    ↓ WindowManagerGlobal.mViews
│                          ~~~~~~
├─ java.util.ArrayList instance
│    Leaking: UNKNOWN
│    ↓ ArrayList.elementData
│                ~~~~~~~~~~~
├─ java.lang.Object[] array
│    Leaking: UNKNOWN
│    ↓ Object[].[2]
│               ~~~
├─ android.widget.LinearLayout instance
│    Leaking: YES (View.mContext references a destroyed activity)
│    mContext instance of com.android.neptune.QuestionnaireMainActivity with mDestroyed = true
│    View#mParent is set
│    View#mAttachInfo is not null (view attached)
│    View.mWindowAttachCount = 1
│    ↓ LinearLayout.mContext
╰→ com.android.nq.QuestionnaireMainActivity instance
​     Leaking: YES (ObjectWatcher was watching this because com.android.nq.QuestionnaireMainActivity received Activity#onDestroy() callback and Activity#mDestroyed is true)
​     key = c4204b14-4279-44d3-ba57-83e5cb26a1ef
​     watchDurationMillis = 5185
​     retainedDurationMillis = 183

person Chris K    schedule 23.01.2020    source источник


Ответы (1)


Эта утечка похожа на ту, что указана здесь: https://github.com/square/leakcanary/blob/1f6c971caba4d5cf78ac561b0cec006a2c482a1b/shark-android/src/main/java/shark/3RelferenceMatchers

Похоже, что синглтон Android WindowManagerGlobal сохраняет ссылку на ваш экземпляр LinearLayout после того, как действие было уничтожено, хотя неясно, почему.

Скорее всего, это не ошибка в вашем приложении, хотя, вероятно, она вызвана поведением, характерным для вашего приложения.

Можете ли вы создать новый выпуск в LeakCanary? https://github.com/square/leakcanary/issues Если вы предоставляете версии Android на который вы видите, а также файл hprof (который очень помогает), тогда мы сможем исследовать и, возможно, определить точную проблему в платформе Android.

person Pierre-Yves Ricau    schedule 24.01.2020
comment
Привет, я тоже испытал это, разница в том, что это происходит во время поворота экрана. Это ложное срабатывание? - person Kevin Gozali; 10.05.2020