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的传递机制

  • 相关阅读:
    有高程点数据,想生成等高线数据后再生成TIN
    【转】ArcGIS Server安装
    CSS定义不规则图片排版
    ArcEngine实现打开shapfile、Raster、TIN文件
    VSS在签出工程时老提示"network not found"或者''Invalid handle"的解决办法
    SiteServer CMS 上传文件过滤,只能是图片格式。
    突然记起我也遇到过一个麻花姐
    六一快乐
    杭州,婺源
    <转>一斗米养个仇人
  • 原文地址:https://www.cnblogs.com/mark888/p/4820991.html
Copyright © 2011-2022 走看看