但是,值得注意的是,不要以为现在handler的出现,使得这些打印操作所在的线程和主线程分开了,其实不然,这里根本没有两个线程在跑,这些打印出来的内容,也是主线程跑出来的。我们可以做个试验,在onCreate函数之后以及打印语句的地方把当前的Thread的名字通过Thread.currentThread.getName()打印出来,可以看到,都是相同的,都是main,这就意味着都是主线程跑出来的。我们知道一个线程的启动需要start()方法,而在这个程序中并没有对HandlerThread进行start,而是直接调用了run()方法了。所以只是main线程在跑就不足为奇了。
从上面的例子来看,这个Handler如果这样用的话,并不是我们想要的效果,因为它没有实现异步,还是在一个主线程中运行。
因此,我们必须换一种方式来使用Handler。
要实现Handler的异步多线程,就需要了解另两个类,一个是Message类,另一个是Looper类。
每个Handler对象中都有一个消息队列,队列中就是存放的Message对象,可以使用obtainMessage()来获得消息对象。同时,Message对象是用来传递使用的,它能传递两个整型和一个Object,尽量使用Message的arg1与arg2两个整型来传递参数,那样系统消耗最小(API如是说),如果传递数据量比较大,则可以使用setData(Bundle a)的方法,其中的Bundle对象可以粗略的看成是一个Map对象,但它的Key都是String,而value是有限的一些类型,可以再API里查看。
Looper类有能够循环地从消息队列中取得消息的功能,我们可以在一个线程中使用Looper,这样,该线程就可以循环的在消息队列里取得消息,知道消息队列为空为止。但我们一般不直接创建和使用Looper,在Android提供的HandlerThread类中,就实现了Looper的功能,所以我们只要使用HandlerThread这个类就可以了,我们用HandlerThread的对象调用getLooper()来得到该线程的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 HandlerDemo2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("Activity---->"+Thread.currentThread().getName());










