细说Handler

今天来说说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的传递机制

posted @ 2015-09-19 18:32  大土豆8  阅读(125)  评论(0编辑  收藏  举报