先看一个使用Handler来切换线程的demo:
该demo中在主线程中创建了一个handler,在子线程里面创建Runnable对象,在子线程中用handler的post(Runnable runnable)操作来发送消息。我们看看打印出来的结果:
1. 05-28 21:34:23.891 21509-21509/mountain_hua.learn_handler1 I/System.out: main thread id 1
2. 05-28 21:34:23.893 21509-21560/mountain_hua.learn_handler1 I/System.out: run thread id 9378
3. 05-28 21:34:24.894 21509-21509/mountain_hua.learn_handler1 I/System.out: Runnable thread id 1
可以看到Runnable的run方法里打印的线程id与onCreate方法的main线程id相同,说明了在子线程调用handler的post方法,虽然Runnable对象是在子线程中实例化的,但Runnable的run方法仍然是运行在主线程中。
接下来通过源码来分析Handler切换线程的原理:
首先看Handler的构造方法:
关键就在mLooper = Looper.myLooper(),因为Looper.myLooper()是得到当前线程对应的Looper:
可知,Looper.myLooper()是得到的是当前线程对应的Looper。
而handler.post(runnable)是首先从消息池得到消息或新建一个消息,然后把runnble赋给消息的callback变量,然后把消息加入到Handler构造方法里得到的当前线程对应的消息队列中,然后在loop()的死循环里调用当前线程的Looper里的消息队列里的消息的Runnable的run方法,则该run方法里运行的当然是该线程。