处理程序内存泄漏

时间:2016-07-31 03:52:37

标签: android memory-leaks

我花了大约15个小时试图解决我的记忆问题,然后阅读了一些有关这方面的问题,但是,我并没有真正找到一个好的答案和解决方案。

每次使用Handler从setOnBufferingUpdateListener更新MediaPlayer时,我都会发送两个整数。然后将整数设置为两个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();
                }

问题来自setTime方法。因为当我评论其中的代码。记忆保持凉爽。

注意:AsyncTask无法修复它,如果想到AsyncTask

2 个答案:

答案 0 :(得分:0)

如果你正在运行一个线程,你需要在onDestroy中取消它(或者可能是onPause或onStop,如果你不在屏幕上时不需要运行它)那么它退出并可以进行垃圾收集。一旦线程被垃圾收集,文本视图就不会有任何引用,这将允许其余的活动被垃圾收集。确保Runnable退出 - 这意味着它需要检查Thread是否已在其主循环中被取消。

如果您在自引用循环中发布给处理程序,则需要在同一位置删除处理程序中的所有消息。

只是一个FYI-你的整个更新程序远比它需要的复杂得多。

答案 1 :(得分:0)

我现在好了。我等了几分钟。那么记忆就会减少。这就是说,清除非引用变量的速度很慢。