Android 学习笔记 10 Hnadler

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();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值