Message Queue:

  Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一次启动程序时会默认会为UI thread创建一个关联的消息队列,可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast receivers 等等。你可以在自己的子线程中创建Handler与UI thread通讯。

  通过Handler你可以发布或者处理一个消息或者是一个Runnable的实例。每个Handler都会与的一个线程以及该线程的消息队列管理。

  Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。

  实例如下:

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   editText = (EditText) findViewById(R.id.weather_city_edit);
   Button button = (Button) findViewById(R.id.goQuery);
   button.setOnClickListener(this);

   Looper looper = Looper.myLooper();  //得到当前线程的Looper实例,由于当前线程是UI线程也可以通过Looper.getMainLooper()得到
    messageHandler = new MessageHandler(looper);  //此处甚至可以不需要设置Looper,因为 Handler默认使用当前线程的Looper
}

public void onClick(View v) {
   new Thread() {
      public void run() {
          Message message = Message.obtain();
          message.obj = "abc";
          messageHandler.sendMessage(message);  //发送消息
       }
   }.start();
}

Handler messageHandler = new Handler {
   public MessageHandler(Looper looper) {
      super(looper);
  }
   public void handleMessage(Message msg) {
      setTitle((String) msg.obj);
   }
}

  对于这个实例,当这个activity执行完onCreate,onStart,onResume后,监听UI的各种事件(如Click点击事件)和消息(如Handler Message)。

  当我们点击一个按钮后,启动一个线程,线程执行结束后,通过handler发送一个消息,由于这个handler属于UI线程,因此这个消息也发送给UI线程,然后UI线程又把这个消息给handler处理,而这个handler是UI线程创造的,他可以访问UI组件,因此更新了页面。

  由于通过handler需要自己管理线程类,如果业务稍微复杂,代码看起来比较混乱,因此android提供了AsyncTask类来解决此问题。