安卓下的消息机制

来源:互联网 发布:mac版有360浏览器吗 编辑:程序博客网 时间:2024/06/04 19:56

    1. 首先说说安卓中为什么要消息机制?

     由于在主线程中在执行耗时操作的时候,会阻塞线程,抛出anr异常,这时,我们就需要创建一个子线程来执行耗时操作(如:查询数据库,网络请求等).而更新UI的操作必须在主线程中进行,这时就需要一种机制使得主线程和子线程进行通讯,消息 机制就产生了。

    2. 消息机制实现原理?

     当应用开启的时候,就会执行当前类所在的main()放法,在这个方法中,系统会自动的先后去调用Looper中的两个静态方法,prepareMainLooper()和loop()方法。

    首先执行prepareMainLooper(),主要是为了创建一个Looper对象和消息队列 。 具体的实现步骤是,当执行prepareMainLooper()方法时,会去调用Looper中的prepare()方法,接着在prepare()方法中,会去执行set(new Looper())操作,即创建了一个Looper对象,而在Looper中的构造方法中,会先去创建一个消息队列MessageQueue,即可以理解为当前的looper对象管理了一个MessageQueue队列

   接着执行Loop()方法,该方法作用可以理解为开启了一个主消息轮询器,从消息队列中依次取出每一条消息,直到当前队列中没有任何消息时,就会进行睡眠状态,直到下一条即时消息(即没有延时操作)的到来,才会唤醒当前线程,接着去监视当前消息队列。

  3.子线程向主线程发送消息?

     当在子线程中向主线程发送消息的时候,会依次调用sendMessageDelayed(..),   sendMessageAtTime(..),将消息发送到消息对列中并排序。具体的排序规则则是:加入当前有优先级分别为2--4--6--8--9的消息在队列中, 这时发来一个优先级为7的消息,我们该如何插进去呢? 也许大家会说将6和8之间的”连线“,去掉,但是这样做的话,优先级为8的消息就不知道自己在队列中的那个位置了。正确的做法则是,现将优先级为7的消息指向8,然后再断开6和8,在断开的过程中,让6指向7,这样,消息就顺利的插入到了消息队列中去了。

4.Handler如何发送和处理消息?

      在创建Handler的对象时,在其构造方法中会先去调用Looper中的一个静态方法mlooper方法,在mlooper()方法中会去返回一个looper对象(该对象是在应用开启的时候在主线程中创建的,上面已经具体描述了),拿到looper对象后,然后通过looper对象拿到消息队列.   当子线程通过Handler的对象发送消息时会到当前这个消息队列,主消息轮询器将从队列中取出消息调用dispatchMessage()方法进行分发,然后在dispatchMessage()方法中,调用handlerMessage()方法来处理当前消息。




0 0
原创粉丝点击