一、子线程发送消息到主线程
public class HandlerTest extends AppCompatActivity {
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_test);
new WorkThread().start();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0x1:
String infomation = msg.obj.toString();
Log.d("fHandlerTest", "handleMessage: --->"+infomation);
break;
}
}
};
}
class WorkThread extends Thread{
@Override
public void run() {
super.run();
Message message = handler.obtainMessage();
message.what=0x1;
message.obj="子线程发送消息到主线程";
handler.sendMessage(message);
}
}
}
我们看一下我们的控制台:
二、主线程向子线程发送消息
- 保证子线程在主线程发送消息前处于启动状态
- 通过Handler来发送消息到子线程中的消息队列中
- 子线程的handMessage来处理主线程发送的消息
public class HandlerTest extends AppCompatActivity {
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_test);
WorkThread wThread=new WorkThread();
wThread.start();
//防止Handler初始化的时候,thread.looper还没有初始化,这里我们让主线程等待100ms.
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler=new Handler(wThread.looper){
@Override
public void handleMessage(Message msg) {
Log.d("Handler", "当前线程是------>"+Thread.currentThread());
super.handleMessage(msg);
switch (msg.what){
case 0x2:
String s = msg.obj.toString();
Log.d("HandlerTest", "handleMessage: --->>"+s);
break;
}
}
};
Message message = handler.obtainMessage();
message.what=0x2;
message.obj="主线程发送消息到子线程中";
Log.d("Handler", "当前线程是------>"+Thread.currentThread());
handler.sendMessage(message);
}
class WorkThread extends Thread{
private Looper looper;
@Override
public void run() {
super.run();
Looper.prepare();
looper=Looper.myLooper();
Looper.loop();
}
}
}
接下来我们继续看我们的控制台
ok,这样子我们就实现了主—>子,子—>主之间的消息传递,接下来我们看下在我们的子线程与子线程间的消息传递。
三、子线程与子线程之间的消息传递
public class HandlerTest extends AppCompatActivity {
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_test);
final WorkThread wThread=new WorkThread();
wThread.start();
Log.i("HandlerTest","当前线程是------>"+Thread.currentThread().getName());
//发送消息到WorkThread线程中
new Thread(new Runnable() {
@Override
public void run() {
handler=new Handler(wThread.looper){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("HandlerTest","当前线程是------>"+Thread.currentThread().getName());
switch (msg.what){
case 0x3:
String s = msg.obj.toString();
Log.i("HandlerTest", "handleMessage: ------>"+s);
break;
}
}
};
Message message = handler.obtainMessage();
message.what=0x3;
message.obj="子--->子";
handler.sendMessage(message);
}
}).start();
}
class WorkThread extends Thread{
private Looper looper;
@Override
public void run() {
super.run();
Log.i("HandlerTest","当前线程是------>"+Thread.currentThread().getName());
Looper.prepare();
looper=Looper.myLooper();
Looper.loop();
}
}
}
同上,我们看一下我们的控制台打印的信息:
OK,到这里我们就对对我们的Handler在线程中消息的传递有一个大致的了解,但是,这只是皮毛。需要进一步探索Handler知识点的童鞋可以跟踪下其源码,或者观看《Android开发艺术》这本书。