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