У меня есть два вида деятельности, оба имеют внутренний класс SurfaceView, который имеет внутренний класс Thread.Первый - это экран меню, а второй - экран гонки, в котором играют в игру.
Чтобы начать второе действие с первого, я делаю это:
Intent intent = new Intent();
intent.setClass(Menu.this, RaceActivity.class);
intent.putExtra("level", level.getNumber());
startActivityForResult(intent, 0);
Когда уровеньзакончено, из второго действия, которое я запускаю.
finish();
Это вызывает мой метод onDestroy.У меня сложилось впечатление, что этого будет достаточно, чтобы сделать второе занятие доступным для сбора мусора.Но когда я заканчиваю гонку и начинаю новую гонку несколько раз, я замечаю, что в конце концов потерплю крах.Используя инструмент Memory Analyzer Tool (MAT) в Eclipse, я обнаружил множество ссылок на мою вторую активность, а SurfaceView и Thread все еще удерживались.Поэтому я также решил очистить их с помощью метода уничтожения.
public void onDestroy() {
super.onDestroy();
mPanel.mThread.destroy(); //destroys surfaceholder in thread
mPanel.mThread = null;
mPanel = null;
}
Кажется, это уничтожило почти все.Но когда я вхожу в МАТ, я все еще вижу одну ссылку на 2-е действие (при выборе Путь к корням GC -> Исключить слабые ссылки)
Class Name | Shallow Heap | Retained Heap
---------------------------------------------------------------------------
com.moz.by.RaceActivity @ 0x405b6108 Unknown| 280 | 8,008
---------------------------------------------------------------------------
Это название действия, которое я пытаюсь выполнить в GC.так что кажется, что он где-то держит ссылку на себя.Либо это, либо ключевое слово Unknown имеют здесь некоторое значение.
Меня смущает проблема, так как я не уверен, куда идти дальше, чтобы найти это.Интересно, смогу ли я найти то, что не так, эта деятельность, наконец, очистится!Я застрял на этом пару дней, поэтому я подумал, что подробно объясню мою проблему вам, хорошие люди.Кто-то может подсказать ошибку для начинающих, которую я допустил.
Спасибо за чтение.
PS Это мое первое приложение, извиняюсь, если я пропустил что-то базовое в своем рабочем процессе.Ниже приведена часть dominator_tree из MAT после того, как я начал и закончил несколько гонок.
Class Name | Shallow Heap | Retained Heap | Percentage
------------------------------------------------------------------------------------------------------------------
com.moz.by.RaceActivity @ 0x405989e8 Unknown | 280 | 4,464 | 0.15%
com.moz.by.RaceActivity @ 0x405b6108 Unknown | 280 | 8,008 | 0.26%
com.moz.by.RaceActivity @ 0x406532e8 Unknown | 280 | 4,024 | 0.13%
com.moz.by.RaceActivity @ 0x4077f290 Unknown | 280 | 5,440 | 0.18%
com.moz.by.RaceActivity$Panel @ 0x40513d40 Unknown | 432 | 1,496 | 0.05%
com.moz.by.RaceActivity$Panel @ 0x40527148 Unknown | 432 | 1,496 | 0.05%
com.moz.by.RaceActivity$Panel @ 0x40653878 Unknown | 432 | 1,496 | 0.05%
com.moz.by.RaceActivity$Panel @ 0x40788490 Unknown | 432 | 1,496 | 0.05%
com.moz.by.RaceActivity$TutorialThread @ 0x40569580 Thread-35 | 120 | 192 | 0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40642558 Thread-37 Unknown| 120 | 192 | 0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40683108 Thread-59 Unknown| 120 | 120 | 0.00%
com.moz.by.RaceActivity$TutorialThread @ 0x406a56f0 Thread-57 | 120 | 192 | 0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40706f20 Thread-51 | 120 | 192 | 0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40707fe8 Thread-45 Unknown| 120 | 192 | 0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x4077fa10 Thread-53 Unknown| 120 | 192 | 0.01%
com.moz.by.RaceActivity$TutorialThread @ 0x40789da0 Thread-43 | 120 | 192 | 0.01%
------------------------------------------------------------------------------------------------------------------
EDIT:
Так что, похоже, последняя ссылка на RaceActivity -во внутреннем внутреннем классе TutorialThread, где он содержит ссылку на класс в переменной this $ 0.См. Ниже.
Type |Name |Value
-----------------------------------------------------------
ref |this$0 |com.moz.by.RaceActivity @ 0x4053b080
ref |mSurfaceHolder|null
ref |mPanel |null
boolean|mRun |false
-----------------------------------------------------------
Я не уверен, почему это происходит, вот как я заканчиваю свою тему.
boolean retry = true;
mThread.setRunning(false);
while (retry) {
try {
mThread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Я думал, что это должно закончить тему, но это никогдаполучает GC из-за этой последней ссылки в странной переменной $ 0.Кто-нибудь знает, что это за переменная и как я могу ее очистить?