我正在使用一个计时器,在监听器事件上被取消并重新启动。除了定时器线程泄漏整个外部类之外,一切都运行良好。
我的计时器实现如下:
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 Analyser追踪问题,最终找到了这里。我还注释掉了回调行的代码,但是线程仍然泄漏,因此肯定是定时器本身出了问题。然而,我并不真正理解那段代码的问题所在。
根据我的研究,问题似乎是匿名内部类(new Timertask())持有对外部类的引用,因此可能会泄漏整个上下文。但我仍然不明白为什么定时器以及上下文引用在线程运行完毕之后(150毫秒+后)仍未被垃圾回收。
最后,我该如何解决这个泄漏问题?我将定时器设置为null,但这并没有解决我的问题。 编辑:
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
}
在ListView的滚动事件中调用moveHeader()函数。
timer
是如何定义的,它定义在哪里? - m0skit0