zoukankan      html  css  js  c++  java
  • 细说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的传递机制

  • 相关阅读:
    Orchard Oracle 支持
    讽刺的是,我在linux下使用最多的命令,竟然是windows的
    学习bash
    提高分布式环境中程序启动性能的一个方法
    MQTT X v1.4.1 正式发布
    社区力量|因为 EMQ,他上了微博热搜
    不止是现在,更关注未来:EMQ 携手高校加强物联网人才培养
    EMQ 助力西安增材制造国家研究院打造增材智能车间平台
    Kuiper 1.0.1 正式发布
    MQTT X v1.4.0 正式发布
  • 原文地址:https://www.cnblogs.com/mark888/p/4820991.html
Copyright © 2011-2022 走看看