У меня очень странное явление (тестовое устройство :HTC Desire HD, Android 2.3.5 ). Я знаю, что System.gc()
не нужен и обескураживает, и я не пытаюсь предложить обратное, но суть в том, что это также не должно вызывать проблем(т. е. должно быть бесполезным самое большее).
У меня есть приложение, которое содержит GLSurfaceView
в своей иерархии представлений. GLSurfaceView
создается и добавляется в Activity.onCreate()
. Обычно приложение работает так:
GLSurfaceView
на View.VISIBLE
GLSurfaceView
Activity.finish()
называется)Мой Activity.onPause()
выглядит так:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
Пока все хорошо, все работает.Однако проблемы появляются после добавления следующего кода вonPause()
(для случая, когда пользователь выходит из игры из главного меню):
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
if (isFinishing()) {
System.gc();
}
Подробно :, если Activity
запускается в первый раз(= т.е. процесс приложения до )не существовал, все работает нормально. Однако начиная со 2-го запуска активности (= после первого выхода из главного меню, т.е. после первогоActivity.finish()
), частота кадров GLSurfaceView снижена на 40 -50% , встроенная игра -становится медленной.
Если я уберу вызов System.gc()
, проблема исчезнет. Более того, если я сделаю следующее, это также избавит от проблемы:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
if (isFinishing()) {
// 1. get layout root of View hierarchy
// 2. recursively remove (detach) all Views
// 3. call GC
System.gc();
}
Я не добавлял конкретный код, потому что он сложный, поэтому использовал комментарии. Если я просто отсоединю GLSurfaceView
через removeView()
, этого недостаточно. Вся иерархия представлений должна быть очищена.
Обратите внимание, что я не смог найти никаких утечек памяти (нет утечки активности через drawables/statics и т. д. ). Более того, конечно же, gameThread корректно завершает работу при закрытии приложения (Я просто не включил его исходный код ).
Есть идеи, предположения? Судя по всему, System.gc()
вызывает некоторые проблемы с механизмом уничтожения Activity/layout в Android. Опять же, как я уже сказал, если я уберу System.gc()
, проблема исчезнет.