Android Handler机制图解以及在实际中的运用

来源:互联网 发布:2016淘宝最新刷单方法 编辑:程序博客网 时间:2024/05/20 08:23

大家在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();            }        });

待续…

原创粉丝点击