目录
Start、说在前面
Handler,相信做Android开发的小伙伴对他都不陌生了。
起初,我也是浮于表面的理解和学习(虽然现在也还是没有太深入,但有种比以前好了一些的感觉),慢慢地发现他竟然在Android中到处都可见。
所以今天分享出来我的一些总结,抛砖引玉,帮助更多人,同时也希望有更多动力去深入。
下面我们来说说他吧~
一、初识Handler
1.1 概念
对一个陌生事物了解,首先从概念开始。
简单说,Handler机制是Android中提供的一种异步回调机制,处理子线程和主线程之间的通信。
1.2 内容
涉及到相关重要类及职责是:
1)Handler:负责发送处理消息.
2)MessageQueue:消息队列,负责存储消息.
3)Message:具体发送的消息.
4)Looper:负责循环取出消息给Handler处理.
5)ThreadLocal:用于线程间的数据隔离,每个线程中存放各自对应的looper.
1.3 小结
机制运作总结:子线程中Handler将消息发送到MessageQueue中,然后Looper不断的从MessageQueue中读取消息并调用Handler.dispatchMessage发送消息,最后Handler处理消息。
1.4 拓展
当然内部机制详细内容仍然要详细追寻源码来发现其中的更多奥秘,这里就不展开说了。
通常我们使用Handler可以去刷新界面,可以去制作定时器等等,但没想到他竟然也跟ANR、内存泄露有着关系。那我们一起再看下去吧。
二、拓展Handler之ANR
2.1 概述ANR
ANR异常:Application Not Response 应用程序无响应 。出现这个异常时,会为用户弹出交互式弹窗,影响用户使用和体验。
2.2 产生原因
产生ANR异常的原因:在主线程执行了耗时操作,对Activity来说,主线程阻塞5秒将造成ANR异常,对BroadcastReceiver来说,主线程阻塞10秒将会造成ANR异常。
2.3 关系说明
Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。
解决ANR异常的方法:耗时操作都在子线程中去执行 但是,Android不允许在子线程去修改UI,可我们又有在子线程去修改UI的需求,因此需要借助Handler。
三、拓展Handler之内存泄露
3.1 概述内存泄露
内存泄露:没有用的对象资源仍与GC-Root保持可达路径,导致系统无法回收。
3.2 产生原因
一般造成的原因:
1)非静态内部类默认持有外部类的引用,比如非静态Handler持有Activity引用
2)接收器、监听器的注册没有取消,比如广播、EventBus
3)Activity的Context造成的
4)资源文件没有关闭造成的
等等,还有很多。
3.3 解决办法
我们可以看到Handler的使用不当也会导致内存泄露问题。
知道了之后,我们使用的时候就可以有的放矢、游刃有余的关注和解决了。
public class MyActivity extends Activity{
//在Activity中 声明一个静态的Handler内部类 并持有外部类的弱引用
private static class InnerHandler extends Handler{
private final WeakReference<MyActivity> mActivity;
public InnerHandler(MyActivity activity){
mActivity = new WeakReference<MyActivity>(activity);
}
@Override
public void handlerMessage(Message msg){
MyActivity activity = mActivity.get();
if(activity!=null){
//...
}
}
}
private final InnerHandler mHandler = new InnerHandler(this);
private static final runnable = new Runnable(){
@Override
public void run(){
//...
}
};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//延时发送消息
mHander.postDelayed(runnable,1000*60*5);
}
}
当然其中涉及到了弱引用的使用,可以自行了解相关内容。
End、写在最后
这样串联下来,对Handler是否有了一个更全面的认识呢?
相信让Handler更充盈了一些。当然他不止这些。还需要我们更深入更广度的挖掘。探究内部原理,发现其中奥秘。
--------------------------------------------------------------------------
如有不妥之处,望见谅。提供您的宝贵建议、意见,我会积极改正的。
码字不易,如您喜欢欢迎收藏、点赞等支持,您的支持是我最大的动力!
后续有新文章的发布,欢迎持续关注。谢谢❤
也欢迎关注关注我的掘金博客 摩羯座程序媛 的个人主页 - 动态 - 掘金