我使用的计时器在监听器事件中被取消并重新启动.除了计时器线程会泄漏整个外部类之外,其他所有方法都工作正常.
我的计时器实现如下:
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分析器来追踪问题并最终解决了问题.我还注释掉了与回调相关的行,但是线程仍然泄漏,因此它本身就是计时器.但是,我不太了解该代码的问题.
据我的研究了解,问题在于匿名内部类(新的Timertask())持有对外部类的引用,因此可能泄漏整个上下文.但是我仍然不明白为什么在线程用完之后(150 ms之后)为什么不对计时器以及对上下文的引用进行垃圾回收.
在这种情况下,即使线程完成后,上下文是否仍然不被释放?
最后,我该如何解决此泄漏?我将计时器设置为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()