线程知识点:
1、handler应该由处理消息的线程创建。
2、handler与创建它的线程相关联,而且也只与创建它的线程相关联。handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程。如:
MyHandler(looper)
3、Android的线程分为有消息循环的线程和没有消息循环的线程。有消息循环的线程一般都会有一个Looper。主线程(UI线程)就是一个消息循环的线程。
Looper.myLooper(); //获得当前的Looper
Looper.getMainLooper () //获得UI线程的Lopper
Looper.prepare() //为当前该线程建立一个消息队列。调用 Looper.loop();之后就进入了消息循环,这个之后就可以发消息、取消息、和处理消息。
4、Handle的初始化函数(构造函数),如果没有参数,那么他就默认使用的是当前的Looper,如果有Looper参数,就是用对应的线程的Looper。
5、Handler.sendMessage(message); //往一个线程发送消息的函数,先初始化messsage,然后调用要发给的线程的handler来发送一个消息。
6. 一个Thead中可以绑定多个Hander(创建handler时,把线程的looper传进去),通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是每个线程中最多只有一个Looper,肯定也就一个MessageQuque。具体可以参考ConnectivityService.java
HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");
handlerThread.start();
mHandler = new InternalHandler(handlerThread.getLooper());
mTrackerHandler = new NetworkStateTrackerHandler(handlerThread.getLooper());
Handler,Thread和Runnable三者间的关系:
Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。
而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。创建线程可以以runbable为参数,也可以用
HandlerThread, 并且HandlerThread里已经初始化了looper。
下面这个例子以runnable为参数创建线程
class MyThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
public class RunnableTicket {
public static void main(String[] args) {
MyThread mt=new MyThread();
new Thread(mt).start();
}
};
mSenderThread = new HandlerThread("RILSender");
mSenderThread.start();
Looper looper = mSenderThread.getLooper();
mSender = new RILSender(looper);
而 class RILSender extends Handler implements Runnable {
public RILSender(Looper looper) {
super(looper); //handler的创建可以以looper为参数,这样handler就和线程的队列绑定了。
}
// Only allocated once
byte[] dataLength = new byte[4];
//***** Runnable implementation
public void
run() {
//setup if needed
}
//***** Handler implementation
@Override public void
handleMessage(Message msg) {
handler的post方法也可运行runnable。用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法
Handler mHandler=new Handler();
mHandler.post(new Runnable(){
@Override public void run()
{ // TODO Auto-generated method stub
}
});
Message obtainMessage (int what, int arg1, int arg2, Object obj)//可以把当前线程的handler赋值给obj,来传递到另一个线程,以便两者互相通信
Message msg = handler.obtainMessage(); //这里的handler应该是目的handler,会把这个handler保存在返回的msg的成员变量里边
Message.sendToTarget 函数就可以发送一个消息到msg里保存的handler去
http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html :轻量级的异步线程,作者写得挺清楚的。
<p></p>