这里介绍下handler中除了sendMessage外还有post的方法发送和处理消息;
介绍几个方法:
final boolean post(Runnable r)
final boolean postAtFrontOfQueue(Runnable r)
final boolean postAtTime(Runnable r, Object token, long uptimeMillis)
final boolean postAtTime(Runnable r, long uptimeMillis)
final boolean postDelayed(Runnable r, long delayMillis)
通过读源码(会在后面的章节中分析下源码),我们会发现这些方法都是一个个嵌套实现的,而且最终都会调用到SendMessageAtTime()这个方法,这也说明post和sendMessage使用的是同一消息队列,不过这些都是后话,会在源码分析的时候和大家在分享下。
先给使用runable更新ui的例子
public class HandlerTest extends Activity {
private Handler handler = new Handler();
private String TAG = "System.out";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler.post(r);
setContentView(R.layout.main);
Log.d(TAG,"Activity id:"+Thread.currentThread().getId());
Log.d(TAG,"Activity name:"+Thread.currentThread().getName());
}
Runnable r = new Runnable()
{
public void run()
{
Log.d(TAG,"Handler id:"+Thread.currentThread().getId());
Log.d(TAG,"Handler name:"+Thread.currentThread().getName());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
他们调用的其实就是同一线程,主线程,为什么呢?因为当一个handler生成一个对象的时候,他就自动与他所在的线程进行了绑定,使用的是同一个消息循环和消息队列;
很多人是不是会这样认为呢,在同一线程,这不是会堵塞主线程,但是handler又是异步的这岂不是自相矛盾了???其实不然,其实handler在生成消息循环的时候,系统会自动生成以个线程,而不是我们主动去产生的,所以其实他不存在阻塞的问题。
这时android的源码:
public static Looper myLooper() {
return sThreadLocal.get();
}
这个函数就是获取消息循环的,而Looper就是从sThreadlocal中获取的,而这个sThreadlocal底层是实现的,是由系统产生的。
所以我觉得,网上很多解释,感觉是有问题,个人理解,愿大家给出你们的想法,相互讨论下。。。。