android中的Handler机制

一、为什么要用Handler

    之所以需要跨线程通信是因为在 Android 中主线程通常只负责 UI 的创建和修改,子线程负责网络访问和耗时操作,因此,主线程和子线程需要经常配合使用才能完成整个 Android 功能,这时候就有了Handler的出现。

二、什么是handler

Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。每个Hanlder都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列。可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个Message,对其进行处理,处理完之后拿出下一个Message,继续进行处理,周而复始。当创建一个Handler的时候,该Handler就绑定了当前创建Hanlder的线程。从这时起,该Hanlder就可以发送Message和Runnable对象到该Handler对应的消息队列中,当从MessageQueue取出某个Message时,会让Handler对其进行处理。

三、什么是Looper

每个线程只能够有一个looper,Looper负责创建并管理当前线程中的messagequeue,调用loop方法后就会在一个无限循环体中不断地从MessageQueue中取出Message并分发给对应的Handler,最后回调handlerMessage()方法处理此消息。Looper才是整个机制的核心

四、什么是MessageQueue

消息队列,先进后出管理Message,在初始化Looper对象时会创建一个与之关联的MessageQueue

五、Handler怎么用

1、创建handler对象:

private  Handler handler = new Handler(){
        @Override
        //书写handleMessage方法,用于第三步接收并处理信息
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //这里是发送消息后对消息进行处理
            int arg1 = msg.arg1;
            int arg2 = msg.arg2;
            String tip = (String) msg.obj;
            if (msg.what==1){
                //更新UI
                downLoadTip.setText("下载完成"+arg1+arg2+tip);
            }
        }
    };

2、发送消息

//创建子线程
new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //子线程睡眠5秒
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //发送更新UI的信息
                       Message message = handler.obtainMessage();
                        //发送信息的三种方法
                        message.what = 1;      //只能为int型
                        message.arg1 =2;        //只能为int型
                        message.arg2 = 3;
                        message.obj = "keep smile";     //可以是字符串,对象等
                        handler.sendMessage(message);
                    }
                }).start();    //启动线程

3、接收并处理消息

private  Handler handler = new Handler(){
        @Override
        //书写handleMessage方法,用于第三步接受信息
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //这里是发送消息后对消息进行处理
            int arg1 = msg.arg1;
            int arg2 = msg.arg2;
            String tip = (String) msg.obj;
            if (msg.what==1){
                //更新UI
                downLoadTip.setText("下载完成"+arg1+arg2+tip);
            }
        }
    };

六、案列解析-倒计时demo

这个倒计时demo主要有两个地方比较重要

第一,我们通过线程来实现出倒计时的效果,并将结果每隔一秒发送给Handler,由Handler来进行更新UI的操作

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            for (int i = time; i >0 ; i--) {
                                //给Handler发送消息
                                handler.sendEmptyMessage(i);
                                //sleep:线程休息的间隔多久    1000毫秒=1秒
                                Thread.sleep(1000);
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();//start,开启线程

第二,创建出Handler对象,并接收子线程发送过来的消息,然后进行UI的更新

private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
                //msg.what是我们子线程发送过来的消息
                s= String.valueOf(msg.what);
                time_et.setText(s);//更新UI
        }
    };

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值