- Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
- Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。Handler类的主要作用:(有两个主要作用)1)、在工作线程中发送消息;2)、在主线程中获取、并处理消息。
- MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message串联起来的,等待Looper的抽取。
- Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
- Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
(三)、Handler、Looper、Message、MessageQueue之间的关系:
Handler,Looper和MessageQueue的三角关系
|
- Looper和MessageQueue一一对应,创建一个Looper的同时,会创建一个MessageQueue;
- 而Handler与它们的关系,只是简单的聚集关系,即Handler里会引用当前线程里的特定Looper和MessageQueue;
- 在一个线程中,只能有一个Looper和MessageQueue,但是可以有多个Handler,而且这些Handler可以共享一个Looper和MessageQueue;
- Message被存放在 MessageQueue中,一个 MessageQueue中可以包含多个Message对象。
- handleMessage() 用在主线程中,构造Handler对象时,重写handleMessage()方法。该方法根据工作线程返回的消息标识,来分别执行不同的操作。
- sendEmptyMessage() 用在工作线程中,发送空消息。
- sendMessage() 用在工作线程中,立即发送消息。
- arg1 用来存放整型数据
- arg2 用来存放整型数据
- obj 用来存放Object数据
- what 用于指定用户自定义的消息代码,这样便于主线程接收后,根据消息代码不同而执行不同的相应操作。
public class MainActivity extends Activity {
private Button button;
private Handler handler=new Handler(){
//接收到消息后先判断消息的标示然后标示匹配后处理相应的消息
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
//取出message携带的数据值
// int num1=msg.arg1;
// int num2=msg.arg2;
// String str=(String) msg.obj;
// System.out.println("arg1="+num1+",arg2="+num2+",obj="+str);
Bundle bundle=msg.getData();
System.out.println("------"+bundle.getString("str"));
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.button);
//点击按钮需要开启工作线程 并且工作线程向主线程(ui线程) 发送消息
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
public void run() {
// Message msg=new Message();
// Message msg=handler.obtainMessage(); 从消息池中取出
Message msg=Message.obtain();// Message 工作线程和ui线程传递消息的载体
//Message默认有3个int类型和1个Object类型的属性 当消息比较简单可以采用属性传递
msg.arg1=100;
msg.arg2=200;//传递的int类型的数据
msg.what=1;//标示当前消息
msg.obj="传递的测试数据";
//当需要传递的数据量比较大时可以采用bundle封装后传递
Bundle bundle=new Bundle();
bundle.putString("str", "bundle传值");
msg.setData(bundle);
handler.sendMessage(msg);
}
}.start();
}
});
}
}