Activity在onDestroy后,Activity对象的WeakReference并不为空

当Activity销毁后,使用WeakReference仍可能返回非空对象,这是由于Android的垃圾回收机制不同于C++。为避免内存泄漏,可以将内部类改为静态,存储Activity的弱引用,并在回调时检查isFinishing()状态。
摘要由CSDN通过智能技术生成

问题描述:

使用普通内部类或匿名类开启线程执行耗时任务,若任务没有结束而Activity销毁,那么,因为内部类或匿名类对外部类Activity持有强引用,会导致Activity对象一直无法释放,从而无法回收,导致内存泄露。

于是,改成外部类或内部静态类后,对Activity不产生强引用了,那么,线程任务结束时,如何回调给Activity呢?

保存Activity的WeakReference,即弱引用。通过WeakReference.get()来判断Activity对象是否存在,然后进行后续处理。在实践时发现,Activity在onDestroy后,通过WeakReference.get()返回的并不是空。这就是C++与gc的差别。C++中,对象被销毁后,内存立即释放,弱引用为空。但是,Android中,对象被销毁后,其引用计数为0,但gc并不一定立即回收,所以此时弱引用仍然有效。

问题解决:

第1步,普通内部类或匿名类放到外部,或改成静态类。

第2步,存储弱引用,以便回调时访问。虽然弱引用不一定异常正确,但还是有必要的,比如内存吃紧时gc直接回收。

第3步,在回调中调用Activity方法时,先判断isFinishing(),如果是,那么可以不必后续处理了。

示例:


                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值