zoukankan      html  css  js  c++  java
  • Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)

    Handler 、 Looper 、Message 这三者都与Android异步消息处理线程相关的概念。
    那么什么叫异步消息处理线程呢?
    异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。
     
     
     
    详细总结:::
    前提,主线程ui,只能刷新页面和处理事件;耗时的数据处理都在子线程中。。。
    那么子线程的数据如何同步到主线程?
    那就需要异步消息处理机制Handler 、 Looper 、Message:::
    1 子线程hander.sendMessage()发送message消息,加入到主线程的消息队列,
    同时Handler必须对应一个looper对象,主线程ui创建的时候,包含一个Looper对象。
    Handler的构造函数中,会把当前ui线程的Looper与Handler关联。
    2 Looper构造函数中创建MessageQueue消息队列对象,loop()方法不断的循环遍历从消息队列中取出子线程发送来的对应消息,回调处理handlerMessage。
    3 多线程处理handler的时候,容易造成内存泄漏。。。
    4 正因为基于消息队列Looper的先进先出形式,所以不会造成阻赛。。。
    5 Activity中的UI主线程中,无需使用显式的方式进行Looper的初始化以及开始循环,是因为Activity内部包含一个Looper对象,它会自动管理Looper,处理子线程中发送过来的消息。
    6 子线程thread想管理消息队列,需要在线程当中调用Looper.prepare()方法使消息循环初始化,并且调用Looper.loop()使消息循环一直处于运行状态,直到停止循环。所以Looper主要就是完成MessageQueue与Handler进行交互的功能。
     
     
    更简单说法::::
    Android只允许主线程更新UI界面(非线程安全的),子线程处理后的结果,即无法直接访问主线程,这就要用到Handler机制来解决此问题.
    基于Handler机制,在子线程先获得Handler对象,该对象将数据发送到主线程消息队列,Main线程通过MainLooper从消息队列中取出Handler发过来的这个消息时,会回调 Handler的handlerMessage()方法。
     
     
    Handler.post(new Runnable())和sendmessage(msg)区别和runOnUiThread()方法
    (1)  都是把消息放到消息队列等待执行,前者放的是一个runnable对象,后者是一个message对象;
    (2)  前者最终还是会转化成sendMessage,只不过最终的处理方式不一样,前者会执行runnable的run方法;后者可以被安排到线程中执行。
    (3)  两者本质没有区别,都可以更新UI,区别在于是否易于维护等。
     
     
    HandlerThread是什么
    HandlerThread继承了Thread,是一个包含有looper的线程类。正常情况下,除了主线程,工作线程是没有looper的,但是为了像主线程那样也能自动循环处理消息,Android也自定义一个包含looper的工作线程——HandlerThread类。
    IntentService里面就包括了HandlerThread,所以才能实现消息队列 循环处理消息,而不阻赛。
     
     
    注意:::
    UI主线程是非线程安全的,负责页面刷新,响应事件
    单线程模型的UI主线程也是不安全的,会造成不可确定的结果。
    线程不安全简单理解为:多线程访问资源时,有可能出现多个线程先后更改数据造成数据不一致。
    线程安全简单理解为:当一个线程访问功能资源时,对该资源进程了保护,比如加了锁机制,当前线程在没有访问结束释放锁之前,其他线程只能等待直到释放锁才能访问,这样的线程就是安全的。
    Android的单线程模型必须遵守两个规则:
    1.  不要阻塞UI线程;
    2.  不要在UI线程之外访问UI组件,即不能在子线程访问UI组件,只能在UI线程访问。
    3 耗时的都放到子线程处理,因为UI线程优先级和其他普通线程一样。被阻塞超过5秒 ,会提示ANR。
     
  • 相关阅读:
    基于Antlr4编写DSL
    【整理】ANTLR应用案例 | 在路上
    【整理】ANTLR应用案例 | 在路上
    The ANTLR Parser Generator
    ANTLR4权威参考手册
    ANTLR Examples
    ANTLRWorks: The ANTLR GUI Development Environment
    http://www.cnblogs.com/vowei/archive/2012/08/24/2654287.html
    写一个编译器
    写一个编译器
  • 原文地址:https://www.cnblogs.com/softwarelanguagebs/p/6939844.html
Copyright © 2011-2022 走看看