我们知道,在android的线程里,是从message loop取出信息来处理的,主线程和子线程、子线程和子线程之间的通讯也是Looper来实现的,接下来我就简单介绍下Looper的使用方法。
主线程(即UI线程)自身就有message loop,不需要创建,而其他线程就需要手动创建,使用prepare()创建loop,使用 loop()来启动loop,直到loop停止。
方法介绍:
返回应用主线程的looper
返回当前线程
loop()
在线程里运行信息队列(message queue)
myLooper()
返回当前线程的looper
myQueue()
返回当前线程的messageQueue对象
prepare()
初始化当前线程的Looper
初始化应用主线程的Looper
quit()
退出Looper
1.主线程向子线程发信息:
首先创建一个子线程,在子线程中创建Looper并且运行,接收主线程向子线程发送的信息,并且处理。
ChildrenLooperThread childerLooperThread=new ChildrenLooperThread();
childerLooperThread.start();
childerLooperThread.start();
public class ChildrenLooperThread extends Thread{
@Override
public void run() {
Looper.prepare();//创建Looper
mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.e("TAG", "mHandler");
Log.e("TAG", msg.obj.toString());//接收主线程向子线程发送的信息,并且处理。
super.handleMessage(msg);
}
};
Looper.loop();//运行
super.run();
}
}
@Override
public void run() {
Looper.prepare();//创建Looper
mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.e("TAG", "mHandler");
Log.e("TAG", msg.obj.toString());//接收主线程向子线程发送的信息,并且处理。
super.handleMessage(msg);
}
};
Looper.loop();//运行
super.run();
}
}
在主线程中向子线程发送信息
Message msg=mHandler.obtainMessage();
msg.obj="主线程向子线程传递数据";
mHandler.sendMessage(msg);
msg.obj="主线程向子线程传递数据";
mHandler.sendMessage(msg);
2.子线程向主线程发送信息
首先创建子线程,通过主线程的handler发送信息,在主线程创建的handler的handlerMessage中处理主线程发送信息。
MainLooperThread mainLooperThread=new MainLooperThread();
mainLooperThread.start();
mainLooperThread.start();
public class MainLooperThread extends Thread{
@Override
public void run() {
Message msg=mainHandler.obtainMessage();
msg.obj="子线程向主线程传递数据";
mainHandler.sendMessage(msg);
super.run();
}
}
@Override
public void run() {
Message msg=mainHandler.obtainMessage();
msg.obj="子线程向主线程传递数据";
mainHandler.sendMessage(msg);
super.run();
}
}
mainHandler=new Handler(Looper.getMainLooper()){//通过主线程的Loope创建handler
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.e("TAG", "mainHandler");
Log.e("TAG", "handleMessage");
Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
super.handleMessage(msg);
}
};
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.e("TAG", "mainHandler");
Log.e("TAG", "handleMessage");
Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
super.handleMessage(msg);
}
};
这样就可以在任意的2个线程间进行通讯。
有积分链接:http://download.youkuaiyun.com/detail/jhg19900321/4561747
无积分链接:https://code.google.com/p/my-csdn-resource/
注:我觉得分享应该是免费的,之所以有有积分的链接,就是为了如果有朋友积分很多,那就选择有积分链接,给我些积分,让我可以下载别人的源码,如果朋友没有积分,那就可以选择无积分的链接,谢谢!