Android的Handler

背景

知其然要知其所以然,为什么会有Handler的出现?举个例子,假设我们在一个Thread中直接刷新某个TextView,并且每毫秒就刷新一次,那么TextView的绘制会疯掉,而且用户体验也不好。所以为了控制UI的刷新频率,Android规定非UI线程不能直接控制UI组件,只能通过Handler来处理。

概念解析

非UI线程计算出结果后,将结果封装到Message里,调用Handler对象将消息放到MessageQueue消息队列里,然后由Looper按照自己的节奏从队列中取出消息,交给Handler对象的handleMessage方法处理。
这里写图片描述

实例化Message
通常使用Message类里的静态方法obtain(),该方法有多个重载版本可供选择;它的创建并不一定是直接创建一个新的实例,而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。如果Message Pool中没有可用的Message实例,则才用给定的参数创建一个Message对象。对于Message对象,一般并不推荐直接使用它的构造方法得到,而是建议通过使用Message.obtain()这个静态的方法或者Handler.obtainMessage()获取。除了上面这种方式,也可以通过Handler对象的obtainMessage()获取一个Message实例。
这里写图片描述

Message可以传递什么值
可以直接赋值一个对象给message.obj,直接赋值个flag给message.what(通常用于区分各个Message),也可以message.setData(bundle),而Bundle对象里可以放各种对象。

Handler对象发送定义好的Message
这里写图片描述
通过上图可以看到,
sendEmptyMessage(int what):直接发送一个flag
sendEmptyMessageAtTime(int what,long uptimeMillis):指定时间发送
sendEmptyMessageDelayed(int what,long uptimeMillis):延迟发送
sendMessageAtFrontOfQueue(Message msg):把消息发到队列前面

MessageQueue和Looper
Looper是MessageQueue(消息队列)的管理者。主线程创建时,会创建一个默认的Looper对象,而Looper对象的创建,将自动创建一个MessageQueue。其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。

使用实例

//定义该类,使用WeakRefrence是为了防止内存泄露
private static class MyHandler extends  Handler {

        private final WeakReference<OrderProFragment> mFragment;

        private MyHandler(OrderProFragment activity) {
            mFragment = new WeakReference<OrderProFragment>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            OrderProFragment fragment = mFragment.get();
            if(fragment!=null){
                fragment.handle(msg);
            }
        }
    };
    //定义处理消息方法
    private void handle(Message msg){
        if (msg.what == RUNNING) {
            baseShowLog("mHandler:RUNNING");
        } else if (msg.what == FINISH) {

            baseShowLog("mHandler:FINISH");
        }
    }

实例化该内部类:

 MyHandler mMyHandler=new MyHandler(this);

在非UI线程中发送消息

private void outsideRun(){
    mPayLeftTime--;
    if (mPayLeftTime == 0) {
        mMyHandler.sendEmptyMessage(FINISH);
    } else if (mPayLeftTime > 0) {
        mMyHandler.sendEmptyMessage(RUNNING);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值