android中主线程和子线程之间的通信是通过handler消息循环机制,主线程中的handler把子线程中的message发送给主线程中的looper,或者主线程中的handler通过post向looper发送一个runnable。looper默认存在于主线程中,子线程中是没有的。那怎么办呢?我们可以把looper绑定到子线程中,调用Looper.prepare()方法为该子线程生成looper,生成后调用Looper.loop()启动消息队列,并且在该子线程中创建一个handler。在另一个子线程中调用该handler发送消息。这样就可以实现子线程间的通信了。
示例代码:
private Handler handler;
//子线程一
class ThreadA implements Runnable{
private Handler mHandler;
//run运行后才不为null在main里判断
public Handler getHandler(){
return mHandler;
}
@SuppressLint("HandlerLeak")
@Override
public void run() {
Looper.prepare();
mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Log.e("线程A","线程B发过来消息了--"+msg.obj);
break;
}
}
};
Looper.loop();
}
}
//子线程二
class ThreadB implements Runnable{
@Override
public void run() {
Message mess=Message.obtain();
mess.what=1;
mess.obj= "线程B"+System.currentTimeMillis();
handler.sendMessage(mess);
}
}
在activity onCreate方法里
ThreadA threadA = new ThreadA();
ThreadB threadb = new ThreadB();
new Thread(threadA).start();
if(threadA.getHandler() == null) {
try {
Thread.sleep(1000);
handler = threadA.getHandler();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
new Thread(threadb).start();
运行即可。