gpt4 book ai didi

java - 定时器内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:35 24 4
gpt4 key购买 nike

我正在使用一个计时器,该计时器在监听器事件上被取消并重新启动。除了计时器线程泄漏整个外部类外,一切正常。

我的定时器实现如下:

        if(timer != null) {
timer.cancel();
timer = null;
timer = new Timer();
}
timer.schedule(new TimerTask() { // Thread leaks!!!!
@Override
public void run() {
mCallback.onHeaderMoving(newToolbarTranslationY );
}
} , 150);

我使用 MAT Analyzer 来追踪问题并最终解决了这个问题。我还注释掉了带有回调的行,但线程仍然泄漏,所以它确实是计时器本身。但是我真的不明白该代码有什么问题。

据我的研究了解,问题在于匿名内部类 (new Timertask()) 持有对外部类的引用,因此可能会泄漏整个上下文。但我仍然不明白为什么计时器和对上下文的引用在线程用完后(150 毫秒以上)没有被垃圾收集。

在这种情况下,上下文是否在线程结束后仍未释放?

最后,我该如何解决这个漏洞?我将计时器设置为空,但这并没有解决我的问题。

编辑

 private OnHeaderMovingCallBack mCallback;
private Timer timer = new Timer();

//... some other parameters


public ScrollingToolbarManager(View toolbar , View pagerStrip , AbsListView listView , OnHeaderMovingCallBack headerMovingCallBack){
this.toolbar = toolbar;
this.pagerStrip = pagerStrip;

this.listView = listView;

mCallback = headerMovingCallBack;

changeStartValues();

}

public static interface OnHeaderMovingCallBack{
public void onHeaderMoving(int translationY);
}

public void moveHeader(){

//... some calculations

//timer implementation from above
}

moveHeader() 在 ListView 的滚动事件上被调用

最佳答案

如果您认为问题在于匿名内部类持有对外部类的引用,那么只需使用静态命名的内部类——这将不持有任何引用。把这样的东西放在你的类(class)里:

static class MyTimerTask extends TimerTask {
private OnHeaderMovingCallBack mCallback;
int newToolbarTranslationY;

public MyTimerTask(OnHeaderMovingCallBack mCallback, int newToolbarTranslationY) {
this.mCallback = mCallback;
this.newToolbarTranslationY = newToolbarTranslationY;
}

@Override
public void run() {
mCallback.onHeaderMoving(newToolbarTranslationY);
}
}

关于java - 定时器内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28680726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com