我花了大约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
答案 0 :(得分:0)
如果你正在运行一个线程,你需要在onDestroy中取消它(或者可能是onPause或onStop,如果你不在屏幕上时不需要运行它)那么它退出并可以进行垃圾收集。一旦线程被垃圾收集,文本视图就不会有任何引用,这将允许其余的活动被垃圾收集。确保Runnable退出 - 这意味着它需要检查Thread是否已在其主循环中被取消。
如果您在自引用循环中发布给处理程序,则需要在同一位置删除处理程序中的所有消息。
只是一个FYI-你的整个更新程序远比它需要的复杂得多。
答案 1 :(得分:0)
我现在好了。我等了几分钟。那么记忆就会减少。这就是说,清除非引用变量的速度很慢。