zoukankan      html  css  js  c++  java
  • Handler

    Handler:直译“操作者”

    百度百科解释:

      Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

    转载:https://blog.csdn.net/qq_37321098/article/details/81535449#1.handler%E4%BD%9C%E7%94%A8%3A%C2%A0

    1.handler作用: 

      1)传递消息Message

    //两种创建消息方法:
    //1.通过handler实例获取
    Handler handler = new Handler();
    Message message=handler.obtainMessage();
     
    //2.通过Message获取
    Message message=Message.obtain();
     
     
    //源码中第一种获取方式其实也是内部调用了第二种:
    public final Message obtainMessage(){
        return Message.obtain(this);
    }

      注:不建议直接new Message,Message内部保存了一个缓存的消息池,我们可以用obtain从缓存池获得一个消息,Message使用完后系统会调用Recycle回收;如果自己new很多Message,每次使用完后系统放入缓存池,会占用很多内存。 

      传递接收消息:

    //传递的数据
    Bundle bundle = new Bundle();
    bundle.putString("msg", "传递我这个消息");
    //发送数据
    Message message = Message.obtain();
    message.setData(bundle);   //message.obj=bundle  传值也行
    message.what = 0x11;
    handler.sendMessage(message);
     
    //////////////////////////////////////////////////////////////
     
    //数据的接收
    final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 0x11) {
                    Bundle bundle = msg.getData();
                    String date = bundle.getString("msg");
                }
            }
    };

       2)子线程通知主线程更新ui(待)

      //创建handler
            final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    if (msg.what == 0x11) {
                        //更新ui
                              ......
                    }
                }
            };
     
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //FIXME 这里直接更新ui是不行的
                    //还有其他更新ui方式,runOnUiThread()等          
                    message.what = 0x11;     
                    handler.sendMessage(message);  
                }
            }).start();

    2.常用api:

        //消息
        Message message = Message.obtain();
        //发送消息
        new Handler().sendMessage(message);
        //延时1s发送消息
        new Handler().sendMessageDelayed(message, 1000);
        //发送带标记的消息(内部创建了message,并设置msg.what = 0x1)
        new Handler().sendEmptyMessage(0x1);
        //延时1s发送带标记的消息
        new Handler().sendEmptyMessageDelayed(0x1, 1000);
        //延时1秒发送消息(第二个参数为:相对系统开机时间的绝对时间,而SystemClock.uptimeMillis()是当前开机时间)
        new Handler().sendMessageAtTime(message, SystemClock.uptimeMillis() + 1000);
     
        //避免内存泄露的方法:
        //移除标记为0x1的消息
        new Handler().removeMessages(0x1);
        //移除回调的消息
        new Handler().removeCallbacks(Runnable);
        //移除回调和所有message
        new Handler().removeCallbacksAndMessages(null);
  • 相关阅读:
    scanf的参数类型自动转换
    Gedit中文乱码
    在VirtualBox的Ubuntu虚拟机中与母体Windows共享文件夹
    Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage
    贝叶斯后验概率小记
    美国计算机专业最好的前20名学校
    Linux磁盘空间不够怎么办?
    Debian6.0装机过程
    把用户加到sudoers组中的方法
    vi命令手册
  • 原文地址:https://www.cnblogs.com/aaronRhythm/p/11736834.html
Copyright © 2011-2022 走看看