Handler作用:
线程之间切换的转换工具,安卓中主要作用是将子线程切换到UI线程,避免UI线程做耗时操作出现ANR
Handler代码架构:
Handler本身只负责发送和接收消息,在activity启动的时候创建一个loop,背后是一个MessageQueue管理着Message,而Looper循环主体,负责监听Message变化,从MessageQueue取出消息,然后向Handler发送消息
Handler的一些思考
- Handler如何与线程关联?
- Handler的应用是线程与线程之间的通信,在handler创建之初,需要先创建Looper,Looper是作为消息循环,当handler创建后,Looper的消息分发给Handler处理,Looper和Thread的对应规则为:一对多,其原因是Looper处理消息循环为死循环
- Looper的创建,如何实现,为什么不会造成线程阻塞?
- Looper的创建可分为两种
- 在activity创建的时候跟随ActivityThread.main方法创建Looper对象并开启loop循环
- 在子线程中开启Looper.prepare();Looper.loop()循环
- 在ActivityThread.main是创建的loop循环会阻塞,但是不会卡住 主要原因有2个
- epoll模型
- 当没有消息的时候会epoll.wait,等待句柄写的时候再唤醒,这个时候其实是阻塞的。
- 所有的ui操作都通过handler来发消息操作。
- 比如屏幕刷新16ms一个消息,你的各种点击事件,所以就会有句柄写操作,唤醒上文的wait操作,所以不会被卡死了。
- epoll模型
- Looper的创建可分为两种
- Looper中的loop方法死循环为什么不会导致应用卡死或者ANR?
- 真正会卡死主线程的操作是在回调方法onCreate/onStart/onResume等操作时间过长,会导致掉帧,甚至发生ANR,looper.loop本身不会导致应用卡死
- Thread和MeassageQueue的关系?
- MessageQueue在对应的Thread中创建,用于存储消息,最后分发消息给Handler处理
- MessageQueue是如何管理Runnable和message?
- 没看源码不知道
- Looper是什么,为什么Looper中的prepare和loop方法要按照固定顺序调用
- 先创建需要绑定的线程和MessageQueue,之后才能loop,否则都没准备搞啥子呢
Aiden-Y 发布了12 篇原创文章 · 获赞 2 · 访问量 1107 私信 关注