Message(消息):是用來攜帶數據的
MessageQueue(消息隊列):是用來存儲消息的
handler:是用來發送和接收消息的
Looper:讓消息隊列一直進行循環的(管理整個這一攤事),漢語是“環”的意思 是一個死循環:Looper會一直將handler中的message存在消息隊列,並不斷從消息隊列中取出,直到消息隊列沒有爲止
消息隊列中每一個消息都是由隊尾插入,由隊頭取出
整體思路:在一個事件中開啓一個線程,在一個線程中定義一個message,在這個message中攜帶數據,通過handler發送過去,在handler中的handleMessage中收到這個數據,並執行相應的操作。一個handler對應一個MessageQueue。Looper管理整個循環。具體而言,在xml'文件中放置一個Button控件,在activity的這個button的點擊事件中使用多種不同的方法定義一個message,並賦值數據,使用handler來發送,在定義的handler對象中重寫handleMessage方法,在這個方法中收到發送message的數據並展示。
activity_main.xml文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="164dp"
android:text="發送消息" />
</RelativeLayout>
MainActivity.java文件:
package com.example.android_handler_message2;
//使用message的幾種方式(不同的構造方法和使用方式)
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button button;
private Handler handler=new Handler(){
@Override
public void handleMessage(android.os.Message msg) {
int arg1=msg.arg1;
int arg2=msg.arg2;
int what=msg.what;
Object obj=msg.obj;
Bundle bundle=msg.getData();
Toast.makeText(MainActivity.this, arg1+" "+arg2+" "+what+" "+obj, 1).show();
Toast.makeText(MainActivity.this, String.valueOf(bundle.getStringArray("str").length), 1).show();
// System.out.println(arg1+" "+arg2+" "+what+" "+obj);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// 啓動一個子線程
new Thread(new MyThread()).start();
}
});
}
public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
// 下面那句代碼在源碼中的解釋:如果消息池中沒有消息,就new一個message;如果有的話就從消息池中取出一個消息
/*
// 第一種方式
Message message=Message.obtain();
message.what=1;
message.arg1=2;
message.arg2=3;
message.obj="jack";
handler.sendMessage(message);
*/
/*
// 第二種方式
Message message=Message.obtain(handler);
message.what=1;
message.arg1=2;
message.arg2=3;
message.obj="jack";
message.sendToTarget();
*/
/*
// 第三種方式
Message message=Message.obtain(handler,33);
message.arg1=1;
message.arg2=2;
message.obj="rose";
message.sendToTarget();
*/
/*// 第四種方式
Message message=Message.obtain(handler,2,"tom");
message.sendToTarget();*/
// 第五種方式
Message message=Message.obtain(handler,2,3,2,"hello");
Bundle data=new Bundle();
data.putStringArray("str", new String[]{"jack","rose","tom"});
message.setData(data);
message.sendToTarget();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}