2016-07-31 89 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

我現在沒事。我等了幾分鐘。那麼內存單獨減少。就是這樣,清除非引用變量的速度很慢。