• 网站刚刚上线,难免有不足的地方,敬请谅解!欢迎提出宝贵意见!

  •    3年前 (2015-07-06)  Android应用开发 安卓应用 |   8 条评论  167 
    文章评分 1 次,平均分 5.0

     

    Android主线程的消息系统(Handler\Looper)

    前言:

    之前的文章写的都是关于Bitmap和内存的优化技术,这一篇文章给大家谈谈Handler

    Handler是Android系统中比较重要的一个知识,在Android多线程面试经常会被问到,在实际项目中的确也经常用到。当然也比较复杂,知识比较多,牵扯到的类有Thread、Looper、Message、MessageQueue。

    Android是支持多线程的,通常应用程序中与用户相关的UI事件都是运行在主线程中,比如点击屏幕、按钮等,为了保持主线程顺畅相应用户事件不被阻塞就需要把耗时的操作(主要是联网、操作大文件等)放到子线程中,这个时候你可能会想到Handler(当然还你可以用其他的比如:异步任务,,这个以后再讲),但是Handler又是怎么和Thread联系起来的呢?这个咱们来看一下Android主线程是怎么创建的。

    ActivityThread:

    在ActivityThread.java中有一个main()函数,这个函数就是在一个应用启动的入口,调用关系是:ActivityManagerService.java中的startProcessLocked函数调用如下代码:

    Process.start又做了如下的操作,只看方法注释就行,现在不需要知道具体做了什么:

    通过注释也能看到上面的函数会找到ActivityThread的main函数并且执行。main函数中创建了Looper,Looper的作用就是利用线程创建一个消息处理队列,并且维护这个消息队列:

    Looper:

    Looper.prepareMainLooper()的代码如下:

    上面的方法注释已经说的很明白,创建了主线程的Looper,这段代码是系统调用的。先看prepare方法做了什么操作。

    创建主线程的Looper,每一个Looper对应一个Thread、一个MessageQueue,创建Looper的时候会创建一个MessageQueue。到目前位置创建了应用的主线程(Thread)、Looper、MessageQueue,调用Looper.loop(),开始不断的从MessageQueue中读取Message并处理,如果没有消息则等待。现在有了消息循环,有了管理消息循环的Looper就差发送消息和处理消息的Handler了。

    Handler:

    这个时候你在你的应用中创建一个Handler,一般都是下面的代码:

    这个Handler是在主线程中创建的,Handler的构造函数如下:

    创建完Handler你就可以用了,比如你发一个消息:

    在系统中会走最终走到Handler.java下面的方法:

    上面的方法第二个是延时毫秒数,queue.enqueueMessage把消息发送到MessageQueue后剩下的就是等待消息被处理,前面不是说了Looper.loop()方法开始轮询消息队列吗,你发送的消息就是在loop方法中读取到的,读取到后谁去处理呢?在loop()方法中有一句代码:

    msg就是你发送到MessageQueue的消息,被读取后调用target.dispatchMessage(),这个target就是上面Handler发送消息是赋值的,就是发送消息的Handler本身,然后Handler调用自己的下面方法就行消息处理:

    因为在new Message的时候callback为空,并且Handler的mCallback = null,所以会调用到你上面new Handler时重写的handleMessage方法。

    总结:

    每一个线程中都对应一个Looper,每一个Looper都对应一个MessageQueue,这个Looper是用来管理消息队列的,主要是读取消息队列和把消息发送给Message的target去处理。到这你应该清楚Thread、Handler、Message、MessageQueue和Looper他们之间的关系了吧。

     

    大家如果对编程感兴趣,想了解更多的编程知识,解决编程问题,想要系统学习某一种开发知识,我们这里有java高手,C++/C高手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序员互动联盟or coder_online,大牛在线为您提供服务。

    Android主线程的消息系统(Handler\Looper)

     

     

    本文原始地址:http://www.coderonline.net/android-thread-messaging-system-handlerlooper.html

    本站所有文章,除特别注明外,均为本站原创,转载请注明出处来自http://www.coderonline.net/

    否则保留追究法律责任的权利!

    关于

    发表评论

    表情 格式
    1. 总记得不错

      raul 评论达人 LV.5 3年前 (2015-07-09) [0] [0]
    2. 我大android需要学习的真的是一生一世的东西

      qiugc123 评论达人 LV.3 3年前 (2015-07-08) [0] [0]
    3. 原来主线程默认就有一个Handler呀,学习了。

      Coder 评论达人 LV.5 3年前 (2015-07-07) [0] [0]
    4. 好文章

      lonely 评论达人 LV.2 3年前 (2015-07-07) [0] [0]
    5. 调试了一把,居然是这样的

      yistn 评论达人 LV.1 3年前 (2015-07-07) [0] [0]
    6. 谢谢作者写的精品文章

      ghost045 评论达人 LV.5 3年前 (2015-07-07) [0] [0]
    7. 努力努力,写出更好的文章给大家。

      leo 作 者 3年前 (2015-07-07) [0] [0]
    8. 简单易懂,handler和looper这一对好兄弟就是这样

      麦子熟了 博 主 3年前 (2015-07-07) [1] [0]
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册