本文依然基于github上的开源框架为基础,看过之前发的 最新Retrofit + RxJava + MVP 那篇blog的讲述,应该明白框架里面的大概,一步步兑现之前的承诺,会写上十篇左右的帖子来讲解里面的要点和难点,今天主要讲述的是baseActivity里面的WeakReference< BaseActivity >。

最初入行的时候,使用handler一般都是如下方式:

private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);/*** 各种操作*/}};

先说下此处的问题,首先,系统会有警告,This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露,因为非静态内部类隐式自动持有外部类的强引用,而静态内部类不会引用外部类对象,目前只需要记住这句话,说到根本原因就牵扯到jvm,这块日后会单独拿出来写一个模块。

再者,这样写的话,如果有一个超生命周期的逻辑,则会出现内存泄漏,百说不如贴上代码:

    private void test() {handler.sendMessageDelayed(Message.obtain(), 60000);finish();}

当Android应用启动的时候,会先创建一个UI主线程的Looper对象,同时会创建一个MessageQueue,Looper循环遍历,把MessageQueue中的message一个一个取出来处理,处理结束后并不会销毁(这和java中消息机制不同,java中处理完便会自动销毁,等待回收),而是等待后续传来的message,只要Handler发送的Message尚未被处理,则该Message及发送它的Handler对象将被线程MessageQueue一直持有,上述代码是activity在finish一分钟后才收到信息,此时的activity中的handler还在被强引用,当这个activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的message持有handler实例的引用,handler又持有activity的引用,所以导致该activity的内存资源无法及时回收,引发内存泄漏,关于handler这块,之前一篇android之handler的刨根问底 进行了详细叙述,有兴趣可以看下。

为何使用弱引用

对于强、软、弱、虚四大引用,之前在简述图片加载框架有过讲述并有代码实例,此处不重复贴代码,对于弱引用,指的是当垃圾回收器扫描到此处垃圾,无论内存是否充足,都会回收,功能上和软引用如出一辙,和软引用最大的不同就是软引用是在内存不足的时候,gc扫描到才会回收此处内存。此处使用弱引用比软引用更加合理,虽然软引用同样可以解决因为强引用导致内存无法回收的问题,但有个前提条件就是需要内存不足的时候才可以,这就没有弱引用来得实在。

改进后的代码如下:

/*** Created by Zero on 2017/7/20.*/
public abstract class BaseActivity<Pre extends BasePresenter> extends AppCompatActivity implements OnClickListener {private static final String DIALOG_LOADING = "DialogLoading";private boolean mVisible;private LoadingDialogFragment waitDialog = null;protected Pre presenter;protected final Handler mHandler = new MyHandler(this);private BroadcastReceiver receiver;private IntentFilter filter;/*****************省略一些不相关代码*****************/@Overrideprotected void onDestroy() {super.onDestroy();/*** 移除mHandler*/mHandler.removeCallbacksAndMessages(null);if (receiver != null) {LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);}}
}
/*** Created by zero on 2017/7/24.*/public class MyHandler extends Handler {private final WeakReference<BaseActivity> mActivity;/*** 从BaseActivity中提取出来,原来是因为内部类会隐式强引用当前类,采用弱引用,避免长生命周期导致内存泄漏** @param activity*/public MyHandler(BaseActivity activity) {mActivity = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {if (mActivity.get() != null) {mActivity.get().requestOver(msg);}}
}

为了避免一些handler拖泥带水,onDestroy方法中对mHandler进行removeCallbacksAndMessages(null)处理,便于mHandler和activity及时被回收。

项目已上传,戳此进入github。

防侧漏之弱引用的使用相关推荐

  1. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  2. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

  3. JVM中强引用,弱引用,软引用和幽灵引用的代码

    上代码: 1 public class ReferenceTest { 2 public static void main(String[] args) { 3 //test1();//软引用 4 / ...

  4. 阿里面试: 说说强引用、软引用、弱引用、虚引用吧

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们都知道 JVM 垃圾回收中,GC判断堆中的对象实例或数 ...

  5. ThreadLocal为什么要使用弱引用和内存泄露问题

    在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用. 下面来看两个问题: 1为什么要使用弱引用 2为什么会出现内存泄露问题 - 为什么要使用弱引用 - 每 ...

  6. Java 四种引用类型:强引用、软引用、弱引用、虚引用

    以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践.去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝 ...

  7. ThreadLocalMap的enrty的key为什么要设置成弱引用

    ThreadLocal如何回收value,什么时候回收?(学习笔记) https://www.cnblogs.com/1693977889zz/p/11111568.html 1)ThreadLoca ...

  8. java 静态内部类 弱引用_Java基础 强引用、弱引用、软引用、虚引用

    前言 在ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc.Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决 ...

  9. 我使出这“三板斧”(分段锁、哈希锁、弱引用锁)灭霸跑了......

    有同学说,学了Java那么多锁,还是没能锁住灭霸,本文教你"三板斧",锁灭霸足矣. 据说,没几个人能真正参透这"三板斧"的精髓,你是不是那个有缘人呢? 最近,在 ...

最新文章

  1. 什么是Java内存模型中的happens-before
  2. python 装饰器是啥?
  3. 从零学PyTorch:DataLoader构建高效的自定义数据集
  4. [CF353C]Find Maximum(贪心)
  5. Spring Boot整合Swagger3注解@ApiImplicitParam的allowMultiple属性
  6. linux chmod命令
  7. 电源管理允许此设备唤醒计算机怎么关掉,电脑如何设置电源管理允许鼠标唤醒计算机...
  8. excel两列数据对比找不同_Excel两组数据做对比,用左右对比图才好看,操作简单又美观...
  9. 多边形的定义为什么要强调封闭图形_11.3.1 多边形讲解.ppt
  10. 嵌入式系统开发-麦子学院(14)- uboot详解(1)
  11. 个人资源小仓库之【工具】!
  12. 人机对战五子棋(权值法)
  13. 6.lambda表达式
  14. 在纪中的第二天,2017-7-8 总结:
  15. 计算机输入法如何显示在桌面快捷方式,电脑桌面输入法图标不见了怎么办
  16. 投资 - 出口 - 消费
  17. fedora如何下载软件
  18. Nat学习(sNat和dNat)
  19. python换脸GIF动画制作
  20. 使用Python登录CSDN(最新验证可用)

热门文章

  1. 什么是SSL安全证书?
  2. D语言游戏编程(1):工作环境
  3. 使用BasicExcel操作Excel
  4. Markdown编辑器-初始模板参考
  5. 4.3、Android Studio突破64K方法限制
  6. Nodejs版本更新
  7. [Unity][FairyGUI]富文本改变颜色
  8. java zoneid 中国_关于时区:Java 8 Time API – ZonedDateTime – 在解析时指定默认的ZoneId...
  9. mac 教程 终端设置代理
  10. ModBus RTU-上位机与PLC通信