我使用的计时器在监听器事件中被取消并重新启动.除了计时器线程会泄漏整个外部类之外,其他所有方法都工作正常.
我的计时器实现如下:
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 parameterspublic 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()
解决方法:
如果您认为问题在于匿名内部类拥有对外部类的引用,则只需使用静态命名的内部类-这将不包含任何引用.在您的班级中放入以下内容:
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); }}
总结 以上是内存溢出为你收集整理的计时器的内存泄漏全部内容,希望文章能够帮你解决计时器的内存泄漏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)