android定时器内存泄露,计时器的内存泄漏

博客围绕Android定时器内存泄漏问题展开。作者的计时器在监听器事件中取消并重启,出现线程泄漏整个外部类的情况。使用MAT分析器追踪,发现匿名内部类持有外部类引用可能导致上下文泄漏,但不明白线程结束后为何不进行垃圾回收,最后探讨如何解决泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用的计时器在监听器事件中被取消并重新启动.除了计时器线程会泄漏整个外部类之外,其他所有方法都工作正常.

我的计时器实现如下:

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值