不知大家是否发现,Handler中有一个构造函数式传入一个消息循环的对象Looper,而在1.2,1.3中说过,如果在一般的子线程中是不能创建handler对象的,因为自身没有带Looper对象,而主线程中是自带有这个对象的,从主线程拿出这个对象的;所以Andriod为了方便,不要开发者自己创建消息循环,所以提供了令外一个类HandlerThread。
HandlerThread继承与Thread,所以本身就是一个线程。他类似于创建了一个含有Looper对象的线程类,而Looper可以用于创建Handler类,这样我们就不用自己实例化Looper对象,调用preare和Loop了,而是直接调用HandlerThread。与普通的Thread相比,就是多了Looper对象。
下面这个是mars写的关于HandlerThread的Demo:
package com.lilin.looper;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
public class HandlerdDemo extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("当前Activity的ID-->" + Thread.currentThread().getId());
HandlerThread handlerThread = new HandlerThread("handler_thread"); // 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
handlerThread.start();// 在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper()); // 生成消息循环
Message msg = myHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);// 将数据存放到Message中
msg.sendToTarget();// 将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
}
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Bundle b = msg.getData();// 从Message中获得数据
int age = b.getInt("age");
String name = b.getString("name");
System.out.println("age is " + age + ", name is" + name);
System.out.println("Handler的ID-->" + Thread.currentThread().getId());
}
}
}
从上面的例子我们不难发现,使用HandlerThread,hander的处理所属于线程不是主线程,这个与1.3中的post Runable是不一样的(他是在同一个线程)。但是我这里提醒下,这不代表post Runable或者send Message的方式不是异步,其实他也是异步的,不过产生消息循环的这些事情交给系统做了,给上份源码:
这是系统调用的:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
而HandlerThread中的源码:
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
两份代码比较下就知道,都是在这里调用了Looper.prepare();来产生的。至于消息循环的创建,handler中则是无参数的构造函数中产生,而handlerThread中则直接是在run方法中产生,然后通过handler的构造函数传递进去的。