LooperActivity
package org.wp.activity;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class LooperActivity extends Activity {
/** iHandler对象 **/
private Handler iHandler;
/** 发送消息 **/
private Button myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.looper);
addMessageHandler();
myButton = (Button) this.findViewById(R.id.myButton);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread() {
public void run() {
iHandler.sendEmptyMessage(0);
}
}.start();
}
});
}
/**
* Looper 类应用于在线程中建立一个消息循环,
* 线程默认是没有消息循环的,
* 我们可以通过在线程中调用 prepare()创建消息循环,
* 然后通过loop() 进入消息循环
*/
private void addMessageHandler() {
iHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
new Thread() {
public void run() {
// 默认情况下Android中新诞生的线程是没有开启消息循环的
// (主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环)
// Looper对象通过MessageQueue来存放消息和事件
// 一个线程只能有一个Looper,对应一个MessageQueue
// 需要先调用Looper.prepare()启用Looper
Looper.prepare();
// 如果没有 Looper.prepare(); 与 Looper.loop();
// 会抛出异常
// Can't create handler inside thread that has not
// called Looper.prepare()
Toast.makeText(LooperActivity.this, "接收到消息",
Toast.LENGTH_SHORT).show();
// 在这里执行这个消息循环如果没有这句
// 就好比只创建了Looper的消息队列而
// 没有执行这个队列
// 那么上面Toast的内容是不会显示出来的
// Looper.loop(); 让Looper开始工作,从消息队列里取消息,处理消息。
Looper.loop();
}
}.start();
}
};
}
}
looper.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="点击发送消息" android:id="@+id/myButton" /> </LinearLayout>