消息机制

andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

1.Handler创建消息

        每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如图所示。

消息机制_第1张图片

2.Handler发送消息

UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。

Handler、Looper、MessageQueue的初始化流程如图所示:

消息机制_第2张图片

Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

3.Handler处理消息

UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

子线程通过Handler、Looper与UI主线程通信的流程如图所示。

消息机制_第3张图片

4、项目案例

btnConfirm.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    progressDialog = ProgressDialog.show(
      EverydayCheckActivity.this, "提示", "正在上传排查信息");
    alertDialog = new AlertDialog.Builder(
      EverydayCheckActivity.this)
      .setTitle("提示")
      .setMessage("排查信息上传成功,是否下发通知单!")
      .setPositiveButton("确定",
        new DialogInterface.OnClickListener() {
         @Override
         public void onClick(DialogInterface dialog,
           int which) {
          Intent intent = new Intent();
          intent.setClass(
            EverydayCheckActivity.this,
            NotificationTableActivity.class);
          // EverydayCheckActivity.this
          // .startActivity(intent);
          Toast.makeText(
            EverydayCheckActivity.this,
            "下发通知单成功", 3000).show();
         }
        }).setNegativeButton("取消", null).create();
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
     @Override
     public void run() {
      progressDialog.dismiss();
                                                //给这个线程创建一个Looper对象,并实现Looper和这个线程的绑定,因为在创建Looper对象的时候,就会创建这个Looper对象的
                                                //MessageQueue对象,,所以Looper.prepare方法创建了两个对象:Looper对象和MessageQueue对象
      Looper.prepare();
                                                //创建一个消息,发送到这个MessageQueue中
      alertDialog.show();
                                                //处理消息队列中的消息。
      Looper.loop();
     }
    }, 3000);
   }
  });



 

你可能感兴趣的:(消息机制)