Handler 对象既发送信息又处理消息
把一个消息从一个线程发送到另一个线程 //在主线程创建一个Handler对象。
//重写Handler的handleMessage方法,这个就是接收并处理消息的方法。
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//msg就是子线程发送过来的消息。
}
};
//开启一个子线程
new Thread(new Runnable() {
@Override
public void run() {
//在子线程发送一个消息。
Message msg = new Message();
handler.sendMessage(msg);
}
}).start();
发送一个空消息
handler.sendEmptyMessage(what);
Message对象有一个Object类型的obj属性
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.i(TAG,"Handler 发送过来的消息是:" + msg.obj);
}
};
new Thread(new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.obj = "我是消息数据";
handler.sendMessage(msg);
}
}).start();
使用 what 来标识消息
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Log.i(TAG, "第一个消息是:" + msg.obj);
break;
case 2:
Log.i(TAG, "第二个消息是:" + msg.obj);
break;
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
Message msg1 = new Message();
msg1.obj = "第一个消息";
msg1.what = 1;
handler.sendMessage(msg1);
Message msg2 = new Message();
msg2.obj = "第二个消息";
msg2.what = 2;
handler.sendMessage(msg2);
}
}).start();
Handler还可以post一个Runnable
new Thread(new Runnable() {
@Override
public void run() {
//在子线程post一个Runnable对象
handler.post(new Runnable() {
@Override
public void run() {
//这里是消息处理的方法
//这里运行在主线程。
}
});
}
}).start();
子线程使用Handler
//声明Handler;
Handler handler;
new Thread(new Runnable() {
@Override
public void run() {
//创建当前线程的Looper
Looper.prepare();
//在子线程创建handler对象
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//这里是消息处理,它是运行在子线程的
}
};
//开启Looper的消息轮询
Looper.loop();
}
}).start();
mBanner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//在主线程发送一个消息到子线程
Message msg = new Message();
handler.sendMessage(msg);
}
});
退出消息轮询
Looper.myLooper().quit();
Looper.myLooper().quitSafely();
用指定的Looper来创建Handler
new Thread(new Runnable() {
@Override
public void run() {
//获取主线程的Looper
Looper looper = Looper.getMainLooper();
//用主线程的Looper创建Handler
handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
//这里是运行在主线程的
}
};
}
}).start();
同一消息不能发两次
//同一个Message发送了两次
Message msg = Message.obtain();
handler.sendMessage(msg);
handler.sendMessage(msg);