2014-02-09 3 views
1

У меня утечка памяти в приложении для Android. Это простой музыкальный плеер. В нижней части экрана у меня есть TextView, который я использую для отображения прошедшего времени. Он обновляется в нижеприведенном потоке.Android runOnUiThread, вызывающий утечку памяти

Каждый раз, когда я меняю ориентацию, размер кучи увеличивается. От взгляда на обновления кучи DDMS, похоже, что моя деятельность не является сборкой мусора. Если, однако, я прокомментирую 6 строк, как я сделал ниже, GC держит кучу в довольно последовательном размере. Не могли бы вы сообщить мне, что это такое?

private void updateTimerAndSeekBar() { 
    Thread updater = new Thread() { 
     SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar1); 
     TextView timer = (TextView) findViewById(R.id.currentTime); 
     public void run() { 

      while (mediaPlayer.isPlaying()) { 

//    runOnUiThread(new Runnable() { 
//     @Override 
//     public void run() { 
//      timer.setText(msToMins(mediaPlayer.getCurrentPosition())); 
//     } 
//    }); 

       try { 
        seekbar.setProgress(mediaPlayer.getCurrentPosition()); 
        sleep(1000); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    updater.start(); 
} 
+0

Создайте кучу кучи через DDMS и используйте MAT, чтобы определить, что удерживает на что. – CommonsWare

+0

Строки, которые вы прокомментировали, на самом деле не имеют эффекта, так как активность уже поддерживается живым потоком. – zapl

ответ

4

Каждый раз, когда вы меняете ориентацию, Android создает и запускает новое действие. Утечка памяти связана с тем, что сборщик мусора не может собрать старую активность, которая больше не нужна, поскольку отдельный поток все еще работает и, как внутренний класс, удерживает активность.

Чтобы избавиться от утечки памяти, вам необходимо остановить и закрыть отдельный поток, когда действие будет уничтожено.

boolean stopThread; 


private void updateTimerAndSeekBar() { 

    stopThread = false; 

    Thread updater = new Thread() { 
     ... 

     while (!stopThread && mediaPlayer.isPlaying()) { 
       try { 
        seekbar.setProgress(mediaPlayer.getCurrentPosition()); 
        sleep(1000); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    updater.start(); 
} 



protected void onDestroy() { 
    stopThread = true; 
    super.onDestroy(); 
} 
+0

Спасибо, отлично работал. – user184994

Смежные вопросы