gpt4 book ai didi

Android runOnUiThread 导致内存泄漏

转载 作者:行者123 更新时间:2023-11-29 16:03:31 27 4
gpt4 key购买 nike

我的 android 应用程序存在内存泄漏。这是一个简单的音乐播放器。在屏幕底部,我有一个 TextView,用于显示耗时。它在下面的线程中更新。

每次我改变方向时,堆大小都会增加。通过查看 DDMS 堆更新,我的 Activity 似乎没有被垃圾回收。但是,如果我像下面所做的那样注释掉这 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 都会创建并启动一个新 Activity 。内存泄漏是由于垃圾收集器无法收集不再需要的旧 Activity ,因为单独的线程仍在运行并且 - 作为内部类 - 正在保留该 Activity 。

要消除内存泄漏,您需要在 Activity 被销毁时停止并结束单独的线程。

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();
}

关于Android runOnUiThread 导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665907/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com