Android 学习笔记 10 Hnadler

来源:互联网 发布:css和js区别 编辑:程序博客网 时间:2024/06/05 06:37

Day10 Handler

  • Handler

Handler

线程之间发送消息
主线程不能执行耗时操作
子线程不能操作主线程UI视图

  • Handler核心类
  • Handler发送消息的两种方式
  • 实例:主线程向子线程发送消息

Handler核心类

  • Message:对发送消息的封装
  • MessageQueue:消息队列
  • Looper:可以循环读取消息(从MessageQueue中)
  • Hnadler:处理消息,同时也发送消息

谁接收消息,handler定义在谁的线程中

Handler发送消息的两种方式

  • 使用 sendMessage(Message msg)方式
  • 使用 post(Runnable r)方式
    //使用sendMessage方式传递数据    Message msg=Message.obtain();    msg.obj;    msg.arg1;    msg.arg2;    msg.what;    msg.setData(Bundle bundle);    sendMessage(Message msg);    //在handler定义中通过重写handleMessage()方式直接接收并处理数据    handleMessage(Message msg);
    //通过post方式传递任务    handler.post(new Runnable(){        @Override        public void run() {                //TODO        }    });    //任务提交给主线程后会由主线程去执行

主线程向子线程发送消息

==理解handler原理==
非常重要

    private void sendMessage(View v){        //点击按钮给子线程发消息        Message msg=Message.obtain();        msg.obj="hello!";        handler.sendMessage(msg);//把Msg放入Handler内部的MessageQueue对象中,这个对象同时也是Looper中的MessageQueue        //在Message类中有一个Hnadler 类型的Callback对象,当发送消息时,这个对象被赋值为发送的Hnadler    }    //创建子线程    class MyThread extends Thread{        @Override        public void run() {            //子线程中没有Looper对象            //需要先有Looper对象            Looper.prepare();//回去现成的本地变量中查找,如果有Looper,得到,否则new 一个Looper,并加入本地变量                            //在Looper创建的同时创建并绑定了MessageQueue()(使用同一个消息队列)            //实例化handler            //同时实现与Looper的绑定            handler=new Handler();//如果直接实例化Hnadler,会出现RuntimeException,原因是子线程中没有Looper对象            //让Looper对象循环读取,当读到消息时会去掉用  msg.target.dispatchMessage(msg);            Looper.loop();        }    }
0 0
原创粉丝点击