WeakReference不影响引用计数
2016-03-28 17:11
369 查看
最近遇到一个问题,先看代码:
这段代码的功能:根据uri下载文件,下载完成后调用DownLoadListener通知用户下载完成,registerRateTaskListener函数将创建的监听器保存在弱引用中。但是测试发现并没有回调该监听器,通过调试发现,在回调时, 弱引用中保存的监听器变成了null。这个问题困扰了我好久,在同事的帮助下,才找到了原因。归根到底是对弱引用和引用计数的理解不够。
由于弱引用并不会使对象的引用计数加1(只有强引用才会),当run方法执行完毕,弱引用中保存的对象就被释放掉了,这就造成回调失败。
一个解决方式是将监听器变为强引用:
这样,run方法执行完毕,listener1不会被释放,就可以回调成功。
ThreadUtil.exec(new Runnable() { @Override public void run() { DownAndUpLoadManager.getInstance().registerRateTaskListener(id, uri.toString(), <span style="font-family: Arial, Helvetica, sans-serif;">new DownLoadListener(id, uri.toString())</span> ); DownAndUpLoadManager.getInstance().httpDownloadFile(id, uri, file, false, false); } });
这段代码的功能:根据uri下载文件,下载完成后调用DownLoadListener通知用户下载完成,registerRateTaskListener函数将创建的监听器保存在弱引用中。但是测试发现并没有回调该监听器,通过调试发现,在回调时, 弱引用中保存的监听器变成了null。这个问题困扰了我好久,在同事的帮助下,才找到了原因。归根到底是对弱引用和引用计数的理解不够。
由于弱引用并不会使对象的引用计数加1(只有强引用才会),当run方法执行完毕,弱引用中保存的对象就被释放掉了,这就造成回调失败。
一个解决方式是将监听器变为强引用:
DownLoadListener listener1; ThreadUtil.exec(new Runnable() { @Override public void run() { listener1 = new DownLoadListener(id, uri.toString()); DownAndUpLoadManager.getInstance().registerRateTaskListener(id, uri.toString(), listener1); DownAndUpLoadManager.getInstance().httpDownloadFile(id, uri, file, false, false); } });
这样,run方法执行完毕,listener1不会被释放,就可以回调成功。
相关文章推荐
- [JS插件] wScratchPad.js刮刮卡效果-页面涂抹消失插件
- 格式化Namenode提示Call From n1/192.168.253.130 to s1:8485 failed on connection exception: java.net.Connec
- 解决问题 “You don't have permission to access /index.html on this server.”
- 【JS+h5】围住神经猫
- CSS3制作炫酷的自定义发光文字
- css中颜色的设置
- [置顶] bootstrap框架下下拉框select搜索功能
- Struts2+jQuery+Json 实现用户登陆
- 深入理解JavaScript系列(二): 原型、原型链与继承
- chrome JS关闭当前页无效问题
- JS正则表达式大全与使用
- HTML学习笔记(一)
- js判断为空
- node 学习的一些资料收集
- SharePoint2013 IT Professional - Version Setting
- JavaScript对象创建方法
- jquery判断中文的长度
- js点击按钮倒计时setTimeout和setInterval
- nio-Buffer
- C#读取JSON字符串