Handler知识点

一、什么是Handler?

        Handler是安卓消息机制的上层接口,在子线程中进行耗时操作后如果需要更新UI就把消息发送给Handler重写Handler的handlerMessage方法进行更新UI。Handler通过发送和处理message和runnable对象关联对应线程的MessageQueue。

        1、可以让对应的Message和Runnable在未来某个时间点进行相应处理

        2、让自己想要处理的耗时操作放在子线程中,让更新UI放在主线程中。

二、Handler的使用方法

        1、post(runnable)


             重写自定义Thread类的run方法执行耗时操作,并在里面实例化Runable类并重写run方法run方法里就是你期望在UI线程里面的更新操作,最后用跟UI线程绑定的Handler.post方法执行runnable。


            post方法里面根本还是调用了sendMessage方法,只是将sendMessage方法进行了一个简单的封装。

        2、sendMessage(message)

            首先第一步,还是要实例化UIHandler并重写他的handlerMessage方法这里面可进行相关的UI操作,此处传入的Message对象就是我们在子线程中包装好的Message对象,是用来判断到底是谁给我发送的消息,以及携带的其他相关信息。


            第二步,同样是重写自定义Thread的run方法,但是这里创建了一个Message对象,Message的what属性标识一个识别码,通过这个识别码可以识别出不同的Meassage,根据不同的Message可以做出不同的操作;Message的arg1和arg2属性也是用来赋值的但这个只是知道就可以。最后通过UIHandler.sendMessage方法把Message发送出去。


三、Handler机制原理

        

        Looper(消息泵):是每个线程所独有的,通过loop()方法读取MessageQueue消息池的消息,读到消息后就把消息发送个Handler进行处理。

     MessageQueue(消息队列):消息队列先进先出的方式来管理Message,在创建Loop的时候同时也创建了MessageQueue,在上图中的Loop成员变量中可以看到MessageQueue对象

        Message(消息对象):what识别码,arg1和arg2传递一些简单的数据,obj对象可以传递一些复杂一点的对象

        Handler(处理者):故名思议是对looper发送过来的消息进行处理,同时也可以发送消息;handler并不是漫无目的的发送消息的,他不能发送到其他的线程,只能发送他相关的线程,也就是他相关线程的MessageQueue当中,MessageQueue又是跟Looper所关联的,所以所Handler发送消息必须要有一个维护他的Looper。


四、Handler引起的内存泄漏以及解决办法

原因:静态内部类持有外部类的匿名引用,导致外部Activity无法释放。

解决:handler内部持有外部activity的弱引用,并把handler改为静态内部类,或者在activity的onDestory里面调用handler.removeCallback()方法。

UIHandler用static修饰

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值