Android 系统(40)Handler的基本概念



大家在Android开发中不免会遇到主线程跟新UI,线程切换的场景,其中Handler就是一名大将了有必要对他进行了解。

一、图解Handler的基本概念

什么是Handler呢,Handler是Android给我们提供来跟新UI的一套机制,也是一套消息处理的机制,可发送也可通过他来处理消息,我们看下图。


二、为什么用Handler

Android为什么要设计只能通过Handler机制跟新UI呢,最根本目的就是解决多线程并发问题,只有主线程能更新UI, 
试想多线程进行更新UI,又没有枷锁机制,会跟新界面混乱,如果对跟新ui 操作进行枷锁处理又会导致性能下降,Handler就出现了

三、Handler的使用步骤

  • 主线程声明Handler实例
private Handler mHandler = new Handler(new Handler.Callback() {
        /**
         * @param message callback用于获取handler发送的消息,
         * @return  如果返回true就回去成功不会向下传递老,即不执行下面的handleMessage方法达到拦截目的
         */
        @Override
        public boolean handleMessage(Message message) {
            return false;
        }
    }){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 0:
                    //在这里可以进行UI操作
                    //对msg.obj进行String强制转换
                    String str = (String) msg.obj;
                    mTvShow.setText(str);
                    break;
                default:
                    break;
            }
        }
    };

  • 子线程发送消息
mTvShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);//模拟网络操作
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //创建一个message设置what字段的值为1,主要是区分不同的message
                        //设置message.obj的内容,调用Handler的message对象
                        String str = "Nice to Meet You";
                        Message msg = new Message();//创建也可用复用系统的message对象Message msg = mHandler.obtainMessage();
                        msg.what = 0;//消息标示
                        msg.arg1=2;//存放整形数据,如果携带数据简单,优先使用arg1和arg2,比Bundle更节省内存。
                        msg.arg2=3;   //存放整形数据
                        //msg.obj = str;//msg.obj = xxx可传递一个对象
                        Bundle bundle=new Bundle();
                        bundle.putString("dd","adfasd");
                        bundle.putInt("love",5);
                        msg.setData(bundle);
                        msg.obj=bundle;   //用来存放Object类型的任意对象
                        mHandler.sendMessage(msg);//子线程中向UI线程发送msg进跟新UI

                        /**
                         * mHandler.sendEmptyMessage(int);发布一个空消息
                         * mHandler.sendMessage(msg);允许你安排一带数据的Message对象到队列中等待跟新。
                         * mHandler.sendMessageAtTime(Message,long);
                         * mHandler.sendMessageDelayed(Message,long);
                         * sendEmptyMessageAtTime(int what, long uptimeMillis); //定时发送空消息
                         * sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息
                         * sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)
                         */
                    }
                }).start();
            }
        });


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值