System.gc (), вызывающий замедление со второго запуска Activity

У меня очень странное явление (тестовое устройство :HTC Desire HD, Android 2.3.5 ). Я знаю, что System.gc()не нужен и обескураживает, и я не пытаюсь предложить обратное, но суть в том, что это также не должно вызывать проблем(т. е. должно быть бесполезным самое большее).

У меня есть приложение, которое содержит GLSurfaceViewв своей иерархии представлений. GLSurfaceViewсоздается и добавляется в Activity.onCreate(). Обычно приложение работает так:

  1. Пользователь запускает приложение и переходит в главное меню
  2. Пользователь выбирает пункт главного меню, который устанавливает GLSurfaceViewна View.VISIBLE
  3. . Пользователь играет со встроенной игрой -на GLSurfaceView
  4. . Пользователь переходит в главное меню и выходит из активности (=> 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(), проблема исчезнет.

11
задан Thomas Calc 22 July 2012 в 16:24
поделиться