Android 使用Handler的问题

Handler

通过在子线程中调用handler.sendMessage()发送的消息message,UI线程中handler.handleMessage()接收,来实现子线程执行任务,完毕后发送信息给UI线程完成更新UI的操作。

实际使用中

应该申明为static不然可能导致内存泄漏

导致内存泄漏的原因:Handler隐性持有外部类Activity的引用(所以可以在handlemessage中直接对外部Activity的UI控件进行修改),当关闭外部Activity,但是子线程尚未执行完毕,依旧持有handler的引用,而handler持有外部类的应用,message>handler>activity这样一条引用链,导致Activity一直被持有引用而无法被回收。

解决一:将Handler申明为static:

 

问题来了,静态内部类(如果在外部类声明为static,程序编译都不会过),只能访问静态的成员变量和方法,不能访问非静态的方法和属性。

静态内部类不再持有外部类的引用,控件都用不了那怎么修改UI?没有意义

怎么办?

在Handler中增加一个对Activity的弱引用(WeakReference),如图

问题解决

引申:强引用,弱引用,软引用

https://www.jianshu.com/p/8488079a939b

解决二:除了将Handler申明为static并使用弱引用之外,还可以从程序逻辑上解决。

导致内存泄漏的原因是因为Activity关闭后,handler依旧持有外部类的引用导致,那么

1、在onDestory()方法中主动的停掉后台线程,将message和handler之间的联系截断,Activity自然就可以在合适的时候被回收

2、在onDestory()方法中主动的调用handler的removeCallbacks()方法,将消息对象从消息队列中移除即可。

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值