2016-07-31 127 views
0

我花了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

回答

-1

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

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

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

+0

就像我说的,问题不在于线程。整数由MediaPlayer.setOnBufferingUpdateListener回调发送。这是关于TextView的settext方法。 – user3502626

+0

你错了 - 它是关于线程。该线程在活动被销毁后继续,但由于调用设置文本视图,它具有对活动的引用。这导致整个活动和所有相关的视图和变量泄漏。修复线程和泄漏。 –

+0

但我无法修复线程,因为我正在使用[MediaPlayer类](https://developer.android.com/reference/android/media/MediaPlayer.html)。当MediaPlayer时间从setOnBufferingUpdateListener更新时,我的代码被调用。 **我没有创建一个线程来更新我的TextView。该线程来自android,我无能为力。此外,代码工作正常,因为当我关闭活动时,内存不会增加,因为我在活动onPause时将处理程序设置为null ** – user3502626

0

我现在没事。我等了几分钟。那么内存单独减少。就是这样,清除非引用变量的速度很慢。