今天来说说Android一个重要类吧:Handler
(我写的博客风格不适合新手,因为我讨厌新手教学,我都是直奔主题,不交代前因后果)
大家都知道Handler的用法一般是线程间的通讯,当然,一个线程内也可以用Handler来通讯。
Handler发消息和回消息有三种回调方式:
第一种,比较少见,sendmessage
private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { return false; } });
第二种,常见的:sendmessage()之后在handleMessage里面处理消息
private Handler mHandler2 = new Handler() { @Override public void handleMessage(Message msg) { } }
第三种,更常见的post,回调方法是run。。。不要看到run就认为是在别的线程,这里run是在主线程里
new Handler().post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } });
有兴趣的可以看看Handler的源码,回调的时候有判断这三种情况,决定具体回调哪一个
注意:Handler的默认构造方法是获取当前线程的Looper,而默认的一个线程是不带Looper的,需要再线程中定义Handler,就需要Looper.looper()
private class Customthread implements Runnable { @Override public void run() { //线程中启动Looper,开始消息循环 Looper.prepare(); Handler hander = new Handler() { public void handleMessage(Message msg) { Log.i(TAG, "77777" + "当前线程为:" + Thread.currentThread()); } }; hander.sendEmptyMessage(1); hander.sendEmptyMessage(1); Looper.loop(); } }
这样Handler才会收到消息,看了源码就知道,Looper.prepare()就是创建了一个Looper,然后开始循环读取消息
如果不想这么麻烦怎么办呢,在Handler的构造方法里面写Looper.getMainLooper()就可以了,这样Handler就是用UI线程的Looper,消息的队列是UI线程的队列
另外再说一个类吧,HandlerThread,不想像上面这么麻烦的话,就建一个HandlerThread类,这个线程自带Looper和消息循环,IntentService就是这么设计的,看看源码就知道了 。
准备睡觉了。。。感谢各位粉丝的关注和留言,下回咱说说View的传递机制