Android handler讲解与实践

一、概述





   在我们的平常的开发中,我们通常是用 Handler 去在线程中更新 UI ,单其实 Handler 的主要用途是消息处理机制。

其实 handler 在我们 framework 中也很多地方用到了,比如,Activity 生命周期的回调,还有很多实践的传递机制,

都用到了 handler,那么现在我们就进入 handler 的世界吧。

为什么谷歌只允许我们在主线程中更新 UI 呢,这是因为如果是多线程更新 UI 的话,会造成界面错乱,而且,多线程

会导致很多问题。



二、handler 简介





1、handler 需要与一个带有 messagequeue 的线程进行绑定,它可以发送 message 或者 Runnable。

2、ActivityThread 会创建一个 looper,looper 会去创建一个 messagequeue ,这个 messagequeue
 
会去管理一些顶级应用,例如 broadcastreceiver 和 Activity 。





三、handler 的使用





其实 handler 的使用还是比较简单的,handler 主要就是去发送一个 message 或者一个 Runnable ,然后在 handler 的 handlemessage 中去处理就可以了。

我们先看第一种情况 handler 去发送 message:

我们首先需要创建一个 handler :


 	private Handler handler = new Handler(){
             @Override
             public void handleMessage(Message msg) {
            	super.handleMessage(msg);
             }
    	};



然后我们在用 handler去发送一个message :


 	Message message = new Message();
        handler.sendMessage(message);

这样就可以发送一个消息了,当发送这个消息之后,这个消息会被 handlerMessage 这个方法所接收,我们可以在 handlerMessage 中去处理 UI 和一些操作。

其实 handler 里面还有很多别的方法发送 message,首先,我们可以通过 handler.obtionMessage 这个方法去获取 Message ,当我们用这个方法去获取 message 的时

候,我们可以通过 message.sendToTarget,去发送message。如果我们想根据不同的message 去进行不同的操作,那我们怎么去判断 message 的不同呢,之前的方法

是 message 可以设置 arg1 和 arg2 这两个值去判断,现在的判断方法一般是根绝 message.what 去判断 message 的不同。最后 message 如果想传递数据的时候,我们

可以通过 message.setData 这个方法去向 handler 中传递一个 Bundle。handler 的通过 sendMessageDelayed 方法延时发送 message 下面我们看一个标准的  

sendMessage

	Message message = new Message();
        message.what = 0x123;
        Bundle bundle = new Bundle();
        bundle.putString("handler","handler");
        message.setData(bundle);
        handler.sendMessageDelayed(message,1000);   //延时一秒发送message



下面我们看一下 handler 发送 Runnable 的情况,handler 发送 Runnable 不需要在 handler 去更新 UI ,只需要在 Runnable 中的 Run 方法去修改 UI 就可以了。



下面看代码:
 	new Thread(){
            public void run(){
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("11111");
                    }
                });
            }
        }.start();   //这个 start 千万别忘记了



这样我们就可以很方便的在线程中去修改 UI 了。post 也有延时发送的方法:postDelayed。 我们可以在 runnable 中不断的调用 handler.postDelayed 方法,


这样就可以实现定时更新 UI 的效果。


最后我们介绍一下 handler 在创建的时候传递的 callback 方法。先看一下代码:


private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            re
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值