一、几个关键概念
1、主线程给自己发送Message
package test.message; 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.TextView; public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest = (Button)this.findViewById(R.id.btn_01); textView = (TextView)this.findViewById(R.id.view_01); btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Looper looper = Looper.getMainLooper(); //主线程的Looper对象 //这里以主线程的Looper对象创建了handler, //所以,这个handler发送的Message会被传递给主线程的MessageQueue。 handler = new MyHandler(looper); handler.removeMessages(0); //构建Message对象 //第一个参数:是自己指定的message代号,方便在handler选择性地接收 //第二三个参数没有什么意义 //第四个参数需要封装的对象 Message msg = handler.obtainMessage(1,1,1,"主线程发消息了"); handler.sendMessage(msg); //发送消息 } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText("我是主线程的Handler,收到了消息:"+(String)msg.obj); } } }
2、其他线程给主线程发送Message
package test.message;
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.TextView;
public class MainActivity extends Activity {
private Button btnTest;
private TextView textView;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnTest = (Button)this.findViewById(R.id.btn_01);
textView = (TextView)this.findViewById(R.id.view_01);
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//可以看出这里启动了一个线程来操作消息的封装和发送的工作
//这样原来主线程的发送就变成了其他线程的发送,简单吧?呵呵
new MyThread().start();
}
});
}
class MyHandler extends Handler{
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg){
super.handleMessage(msg);
textView.setText("我是主线程的Handler,收到了消息:"+(String)msg.obj);
}
}
//加了一个线程类
class MyThread extends Thread{
public void run(){
Looper looper = Looper.getMainLooper(); //主线程的Looper对象
//这里以主线程的Looper对象创建了handler,
//所以,这个handler发送的Message会被传递给主线程的MessageQueue。
handler = new MyHandler(looper);
//构建Message对象
//第一个参数:是自己指定的message代号,方便在handler选择性地接收
//第二三个参数没有什么意义
//第四个参数需要封装的对象
Message msg = handler.obtainMessage(1,1,1,"其他线程发消息了");
handler.sendMessage(msg); //发送消息
}
}
}
3、主线程给其他线程发送Message
package test.message; 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.TextView; public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest = (Button)this.findViewById(R.id.btn_01); textView = (TextView)this.findViewById(R.id.view_01); //启动线程 new MyThread().start(); btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { //这里handler的实例化在线程中 //线程启动的时候就已经实例化了 Message msg = handler.obtainMessage(1,1,1,"主线程发送的消息"); handler.sendMessage(msg); } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText("我是主线程的Handler,收到了消息:"+(String)msg.obj); } } class MyThread extends Thread{ public void run(){ Looper.prepare(); //创建该线程的Looper对象,用于接收消息 //注意了:这里的handler是定义在主线程中的哦,呵呵, //前面看到直接使用了handler对象,是不是在找,在什么地方实例化的呢? //现在看到了吧???呵呵,开始的时候实例化不了,因为该线程的Looper对象 //还不存在呢。现在可以实例化了 //这里Looper.myLooper()获得的就是该线程的Looper对象了 handler = new ThreadHandler(Looper.myLooper()); //这个方法,有疑惑吗? //其实就是一个循环,循环从MessageQueue中取消息。 //不经常去看看,你怎么知道你有新消息呢??? Looper.loop(); } //定义线程类中的消息处理类 class ThreadHandler extends Handler{ public ThreadHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ //这里对该线程中的MessageQueue中的Message进行处理 //这里我们再返回给主线程一个消息 handler = new MyHandler(Looper.getMainLooper()); Message msg2 = handler.obtainMessage(1,1,1,"子线程收到:"+(String)msg.obj); handler.sendMessage(msg2); } } } }
4、其他线程给自己发送Message
package test.message; 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.TextView; public class MainActivity extends Activity { private Button btnTest; private TextView textView; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnTest = (Button)this.findViewById(R.id.btn_01); textView = (TextView)this.findViewById(R.id.view_01); btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { //启动线程 new MyThread().start(); } }); } class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ super.handleMessage(msg); textView.setText((String)msg.obj); } } class MyThread extends Thread{ public void run(){ Looper.prepare(); //创建该线程的Looper对象 //这里Looper.myLooper()获得的就是该线程的Looper对象了 handler = new ThreadHandler(Looper.myLooper()); Message msg = handler.obtainMessage(1,1,1,"我自己"); handler.sendMessage(msg); Looper.loop(); } //定义线程类中的消息处理类 class ThreadHandler extends Handler{ public ThreadHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ //这里对该线程中的MessageQueue中的Message进行处理 //这里我们再返回给主线程一个消息 //加入判断看看是不是该线程自己发的信息 if(msg.what == 1 && msg.obj.equals("我自己")){ handler = new MyHandler(Looper.getMainLooper()); Message msg2 = handler.obtainMessage(1,1,1,"禀告主线程:我收到了自己发给自己的Message"); handler.sendMessage(msg2); } } } } }