您的位置:首页 > 移动开发 > Android开发

Android基础学习之消息发送使用Looper

2015-10-05 15:01 253 查看
利用Looper实现UI线程发送消息给子线程。

用法:

Looper 类

class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();//step1
mHandler = new Handler() { //step2
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();//step3
}
}


示例:

1.xml布局



2.java代码

public class MainActivity extends Activity implements OnClickListener {

private TextView textView;
private Button button1;
private Button button2;
private LooperThread looperThread;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//初始化Looper线程并启动
looperThread = new LooperThread();
looperThread.start();

textView = (TextView) findViewById(R.id.textView1);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);

textView.append("子线程已经启动\n");
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Message message = Message.obtain();//从消息池中获取消息对象,避免重复创建
message.what = 100;
looperThread.getWh().sendMessage(message);//利用Looper线程发送消息
break;
case R.id.button2:
Message message1 = Message.obtain();
message1.what = 400;
looperThread.getWh().sendMessage(message1);
break;

default:
break;
}
}

private class LooperThread extends Thread {
private Myhandler wh;

public synchronized Myhandler getWh() {
return wh;
}

@Override
public void run() {
Log.e("ql debug", "子线程开始工作了...名字叫:"
+ Thread.currentThread().getName());
Looper.prepare();// 1.初始化当前线程用的looper对象
wh = new Myhandler();// 2.初始化好handler对象
Message msg = Message.obtain();
msg.what = 200;
wh.sendMessage(msg);
//当Looper被执行终止时才会跳出循环,执行后面的语句
Looper.loop();// 3.当前线程的looper对象开始工作了. 进入looper世界
Log.e("ql debug", "子线程的looper循环被终止");
}

private class Myhandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 100) {
Log.e("ql debug",
"子线程收到主线程发来的消息,时间是:" + System.currentTimeMillis());
}
if (msg.what == 400) {
Log.e("ql debug",
"子线程收到主线程发来的停止循环消息,时间是:"
+ System.currentTimeMillis());
wh.getLooper().quit();// 终止looper循环
}
if (msg.what == 200) {
Log.e("robin debug",
"子线程收到子线程发来的消息,时间是:" + System.currentTimeMillis());
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Looper