我花了15个小时试图解决我的记忆问题,然后阅读一些关于这个问题,但是,我真的找不到一个好的答案和解决方案。处理程序内存泄漏
每当MediaPlayer时间从setOnBufferingUpdateListener使用处理程序更新时,我发送两个整数。然后将整数设置为两个TextView。但每次更新时间。 Android工作室的Android监视器显示内存递增1兆字节。
我不想那样。在这里我的课程。
的处理程序:
public class UpdateH extends android.os.Handler {
private OnUpdate onUpdate;
public UpdateH() {
}
public UpdateH(Callback callback) {
super(callback);
}
public UpdateH(Looper looper) {
super(looper);
}
public UpdateH(Looper looper, Callback callback) {
super(looper, callback);
}
@Override
public void handleMessage(Message msg) {
onUpdate.update(msg.arg1, msg.arg2);
}
public void setOnUpdate(OnUpdate onUpdate) {
this.onUpdate = onUpdate;
}
public interface OnUpdate{
void update(int cu, int t);
}
}
在片段:
@Override
public void onPause() {
super.onPause();
Player.playerProgressHandler = null;
mu = null;
}
private UpdateH mu;
@Override
public void onResume() {
super.onResume();
mu = new UpdateH(Looper.getMainLooper());
mu.setOnUpdate(new UpdateH.OnUpdate() {
@Override
public void update(int cu, int t) {
setTime(cu, t);
}
});
Player.playerProgressHandler = mu;
}
private void setTime(int current, int total){
this.current.setText(String.format("%02d:%02d:%02d",
(int) ((current/(1000 * 60 * 60)) % 24),
(int) ((current/(1000 * 60)) % 60),
(int) (current/1000) % 60));
this.total.setText(String.format("%02d:%02d:%02d",
(int) ((total/(1000 * 60 * 60)) % 24),
(int) ((total/(1000 * 60)) % 60),
(int) (total/1000) % 60));
}
在线程:
if(playerProgressHandler != null && mp != null && mp.isPlaying()){
Message message = Message.obtain();
message.setTarget(playerProgressHandler);
message.arg1 = mp.getCurrentPosition();
message.arg2 = mp.getDuration();
message.sendToTarget();
}
的问题来自于时刻设定方法。因为当我评论它的代码。内存保持冷静。
注:的AsyncTask无法修复它,如果想的AsyncTask
就像我说的,问题不在于线程。整数由MediaPlayer.setOnBufferingUpdateListener回调发送。这是关于TextView的settext方法。 – user3502626
你错了 - 它是关于线程。该线程在活动被销毁后继续,但由于调用设置文本视图,它具有对活动的引用。这导致整个活动和所有相关的视图和变量泄漏。修复线程和泄漏。 –
但我无法修复线程,因为我正在使用[MediaPlayer类](https://developer.android.com/reference/android/media/MediaPlayer.html)。当MediaPlayer时间从setOnBufferingUpdateListener更新时,我的代码被调用。 **我没有创建一个线程来更新我的TextView。该线程来自android,我无能为力。此外,代码工作正常,因为当我关闭活动时,内存不会增加,因为我在活动onPause时将处理程序设置为null ** – user3502626