Android实现弱引用AsyncTask,将内存泄漏置之度外。

AsyncTask可谓是在Android中隐藏很深,曾经叱咤风云的功夫级人物。它的存在让网络和UI的通信变得异常简单和轻松。AsyncTask使用上的简单也得以让很多开发者青睐。一般情况下,AsyncTask会作为内部类在Activity或者Fragment中实现,例如:


相信很多朋友都是这么玩的。但是这样写会不会有问题呢?答案是肯定的。

首先,我们知道Java语言是一种强类型,强引用的语言。在一个类中创建内部类时,内部类会默认对外部类持有引用。可以简单的理解为,外部类作为了一个寄托者将内部类绑定在了自己身上。我们知道Activity或者Fragment是有生命周期存在的。并且AsyncTask多用于处理耗时操作(数据库,IO读写,网络请求等等。。)此时,就会出现一个严重的问题:在Activity或者Fragment生命周期结束后,由于AsyncTask的耗时任务尚未完成,导致Activity或者Fragment无法释放资源。即发生我们经常所听到的 “内存泄漏”。

有朋友可能不明白了,为什么会产生内存泄漏呢?

我们上面提到,由于内部类和外部类的绑定关系,并且AsyncTask的耗时操作导致外部类资源不能被及时GC。Java中默认的引用持有都是强引用类型。例如我们直接new出来的对象。为了避免这些问题,Java还为我们提供了软引用,弱引用,

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Songlcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值