从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;
- }
- }
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发送信息的过程。