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()方法,将消息对象从消息队列中移除即可。