主要看代码:
/**
*
* 关于handler、message、MessageQueue、looper
* 1、一个线程Thread只有一个Looper,这个Looper不是默认有的,需要通过调用Looper.prepare();
* 和Looper.loop();启动和初始化,Activity默认是有一个Looper,所以不需要调用prepare和loop
*
* 2、handler会绑定一个线程,在那个线程里面实例化则绑定那个线程,handler是用来发送和接受消息的
* handler可以发送和接受多个消息,Looper是管理handler message机制的
*
* 3、message是通过handler来操作的,可以handler主动来发送,也可以是message设置handler来发送
* 获取message的最好办法是Message.obtain()或者Handler.obtainMessage()
*
* 4、post和sendMessage 在handler里面覆盖sendMessage方法来处理message
* post里面的runable是跟handler实现的位置是同一个线程
*
* @author WangYD
* @time 2015年8月6日
*
*/
public class HandlerActivity extends Activity implements OnClickListener {
private static final String TAG = "HandlerActivity";
private Button btn1 = null;
private Button btn2 = null;
/**
* 这个handler是在main里面实例化,所以这个是被main线程的Looper管理,可以处理从子线程里由这个handler发送的消息
* 如果handler是在子线程里面实例化(可以在main里面声明),则这个handler是由子线程的Looper管理,
* 可以处理从main线程里由这个handler发送的消息main里面的Looper是系统自动产生的,
* 但是子线程的Looper需要通过调用Looper.prepare()和Looper.loop()来产生初始化Looper
*/
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
DBG.log(TAG, "main:" + msg.obj.toString());
}
};
/** 这个在子线程里面实例化 */
private Handler handler2 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
btn1 = (Button) findViewById(R.id.a_button1);
btn2 = (Button) findViewById(R.id.a_button2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
new Thread() {
@SuppressLint("HandlerLeak")
public void run() {
Looper.prepare();
handler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
DBG.log(TAG, "thread:" + msg.obj.toString());
}
};
Looper.loop();
}
}.start();
DBG.log(TAG, "Begin Post");
/** 等待handler2初始化完成 */
while (handler2 == null)
;
/**
* 这个runable跟调用的handler初始的线程是同一个线程 , 使用handler的时候要等到run完成才出现按键
* 使用handler2的时候,按键是很快就出现了
*/
handler2.post(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 9; i++) {
DBG.log(TAG, "run");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
DBG.log(TAG, "After Post");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.a_button1:
new Thread() {
public void run() {
handler.obtainMessage(0, "Hello Wangyidong").sendToTarget();
};
}.start();
break;
case R.id.a_button2:
handler2.obtainMessage(0, "Hello World").sendToTarget();
break;
}
}
}
源码下载:http://download.csdn.net/detail/yidong_wang/8975697