发表于: 2018-10-21 23:28:53

0 758


一、今天完成的事情

在子线程中更新UI

Android的异步消息处理机制

    Android不允许在子线程中执行更新UI的操作,只能在主线程中执行更新UI,否则会出现异常,但有时候一些耗时操作必须在子线程中进行,完后需要根据结果来更新相应的UI,比如在子线程中执行下载文件这个操作,下载完成后需要弹出一个Toast提示用户下载完成了,这时候就需要用到Android的异步消息处理机制。

    Android的异步消息处理机制主要分为四个部分:Message、Handler、MessageQueue、Looper。

 (1)Message

          Message(消息),是线程之间传递的消息,除了作为消息被传递,它的内部还可以携带少量的信息用于

          线 程之间交换数据。

 (2)Handler

         Handler主要用于发送和处理消息,Handler的sendMessage()方法发送消息,使用handleMessage()

         方法接收并处理消息。

 (3)MessageQueue

          MessageQueue(消息队列)用于存放所有经Handler返送出来的消息,所有的消息会在消息队列中排队等待被处理,每个线程只能有一个MessageQueue对象。

 (4)Looper

          Looper是MessageQueue中的管理者,调用loop()方法后,Looper会进入到一个无限循环的状态,一旦发现MessageQueue中有消息来排队了,就会把消息取出来,然后传递到Hanler的handleMessage()方法中,每个线程只有一个Looper对象。

          

       总结异步消息的主要流程:在主线程中创建一个Handler对象,重写handleMessage()方法,当子线程需要执行更新UI的操作时,就创建一个Message对象——消息,通过Handler将消息发送出去,消息会被加入到子线程的MessageQuieue的队列中等待被一直在循环的Looper取走,Looper将消息传回Handleer的

handleMessage()方法中,handleMessage()里有相应的更新UI的具体操作。简单来讲,子线程需要更新UI时,就会派一个跑腿的(message)去通知主线程,跑腿的可能会有很多个,所以他们会在子线程的MessageQueue里排队等待,Looper是MessageQueue里的管理员,他一直在MessageQueue里转悠,发现一个跑腿的就把他带到主线程的Hnadler里,跑腿的告诉handler子线程想要更新UI,然后Handler就会派一个对应的

handlerMessage()去执行UI更新。

      归根到底,执行更新UI的操作还是在主线程中完成的。     

private static class MyHandler extends Handler {
   private final WeakReference<SetAddressFragment> mFragment;
   public MyHandler(SetAddressFragment mFragment) {
      this.mFragment = new WeakReference<SetAddressFragment>(mFragment);
   }
   @Override
   public void handleMessage(Message msg) {
       if (mFragment.get() == null) {
          return;
       }
            switch (msg.what) {
              case DATABASE_OK:
               showProvince();
               break;
              default:
               break;
       }
    }
}

创建Handler对象

private MyHandler mHandler = new MyHandler(this);

子线程发送消息通知主线程更新UI

mHandler.sendEmptyMessage(DATABASE_OK);

        

二、明天计划的事情

      选择一个第三方分享平台,查看文档,集成开发环境。

      

三、遇到的问题

       

四、收获

      异步消息处理机制。



返回列表 返回列表
评论

    分享到