Handler的一些认识和思考

Handler作用:

线程之间切换的转换工具,安卓中主要作用是将子线程切换到UI线程,避免UI线程做耗时操作出现ANR

Handler代码架构:

Handler本身只负责发送和接收消息,在activity启动的时候创建一个loop,背后是一个MessageQueue管理着Message,而Looper循环主体,负责监听Message变化,从MessageQueue取出消息,然后向Handler发送消息

 

Handler的一些思考

  1. Handler如何与线程关联?
    1. Handler的应用是线程与线程之间的通信,在handler创建之初,需要先创建Looper,Looper是作为消息循环,当handler创建后,Looper的消息分发给Handler处理,Looper和Thread的对应规则为:一对多,其原因是Looper处理消息循环为死循环
  2. Looper的创建,如何实现,为什么不会造成线程阻塞?
    1. Looper的创建可分为两种
      1. 在activity创建的时候跟随ActivityThread.main方法创建Looper对象并开启loop循环
      2. 在子线程中开启Looper.prepare();Looper.loop()循环
    2. 在ActivityThread.main是创建的loop循环会阻塞,但是不会卡住 主要原因有2个
      1. epoll模型 
        1. 当没有消息的时候会epoll.wait,等待句柄写的时候再唤醒,这个时候其实是阻塞的。
      2. 所有的ui操作都通过handler来发消息操作。
        1.  比如屏幕刷新16ms一个消息,你的各种点击事件,所以就会有句柄写操作,唤醒上文的wait操作,所以不会被卡死了。
  3. Looper中的loop方法死循环为什么不会导致应用卡死或者ANR?
    1. 真正会卡死主线程的操作是在回调方法onCreate/onStart/onResume等操作时间过长,会导致掉帧,甚至发生ANR,looper.loop本身不会导致应用卡死
  4. Thread和MeassageQueue的关系?
    1. MessageQueue在对应的Thread中创建,用于存储消息,最后分发消息给Handler处理
  5. MessageQueue是如何管理Runnable和message?
    1. 没看源码不知道
  6. Looper是什么,为什么Looper中的prepare和loop方法要按照固定顺序调用
    1. 先创建需要绑定的线程和MessageQueue,之后才能loop,否则都没准备搞啥子呢

 

 

 

Handler的一些认识和思考Handler的一些认识和思考 Aiden-Y 发布了12 篇原创文章 · 获赞 2 · 访问量 1107 私信 关注
上一篇:PHP-应用程序/控制台资产:使用流包装器错误安装到S3


下一篇:AWS Aurora是否遭受与MySQL相同的局限性?