我的Android应用程序中发生内存泄漏。这是一个简单的音乐播放器。在屏幕底部,我有一个TextView,用于显示经过的时间。它在下面的线程中更新。
每次更改方向时,堆大小都会增加。通过查看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();
}
每次更改方向时,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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句