从Main Thread 向Worker Thread发送消息总共分成三个步骤:
1,准备Looper对象
2,在Worker Thread当中生成Handler对象
3,在Main Thread当中发送消息
下面举个例子来说明:
开发步骤:
1,新建一个Android应用程序
2,在布局文件中添加一个Button控件标签,并为其设置属性和值
3,在Activity中,声明Button控件变量并根据id获得控件对象 ,设置该Button的监听器,
4,在Activity中,创建一个Thread的继承类WorkerThread,并重写run()方法
5,在Activity中,创建一个Handler的继承类MyHandler,并重写handleMessage()方法
代码如下:
package com.example.s02e07_handler03;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button button;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new ButtonListener());
WorkerThread wt = new WorkerThread();
wt.start();
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
}
}
class WorkerThread extends Thread{
@Override
public void run() {
//准备Looper对象
Looper.prepare();
//在workThread当中生成一个Handler对象
handler = new MyHandler();
//也可以用匿名内部类的方法实现
// handler = new Handler(){
// @Override
// public void handleMessage(Message msg){
// System.out.println("收到");
// }
// };
//调用Looper的loop()方法之后,Looper对象将不断的从消息队列中取出消息对象,然后调用handlerMessage()方法处理该消息对象
//如果消息队列中没有对象,则该线程阻塞
Looper.loop();
}
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
System.out.println("收到");
}
}
@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;
}
}
当运行程序时:
1,会在Main Thread中运行一个Work Thread 线程wt
2,wt调用Looper的loop()方法之后,Looper对象将不断的从消息队列中取出消息对象
3,当点击button后,会向消息队列中发送一个消息对象msg,此时会被Work Thread中的Looper对象从消息队列取出,然后调用handlerMessage()方法处理该消息对象
这样就完成了从Main Thread向Work Thread发送信息的过程。