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) { Looper looper = Looper.myLooper(); //得到当前线程的Looper实例,由于当前线程是UI线程也可以通过Looper.getMainLooper()得到 public void onClick(View v) { Handler messageHandler = new Handler { |
对于这个实例,当这个activity执行完onCreate,onStart,onResume后,就监听UI的各种事件(如Click点击事件)和消息(如Handler Message)。
当我们点击一个按钮后,启动一个线程,线程执行结束后,通过handler发送一个消息,由于这个handler属于UI线程,因此这个消息也发送给UI线程,然后UI线程又把这个消息给handler处理,而这个handler是UI线程创造的,他可以访问UI组件,因此就更新了页面。
由于通过handler需要自己管理线程类,如果业务稍微复杂,代码看起来就比较混乱,因此android提供了AsyncTask类来解决此问题。