android Handler使用

Handler和looper有密切关系.looper实现了轮询消息队列的机制,每个安卓线程只能对应一个looper和一个消息队列,主线程的looper在应用启动的过程中就创建了。所以应用之所以不会直接运行完退出就是因为应用处于消息队列为空时的阻塞状态,而不同的组件的生命周期在UI上的表现都是以发送消息给对应主线程的消息队列再进行处理而对应的。


一个线程可以有多个Handler,他们创建时能通过获取本线程对应的Looper,再获取对应的消息队列,当使用Handler的send方法是,Handler会将发送的message的target设置为自己的引用再放到消息队列中,这样在looper在从消息队列取出这个消息时,就能根据这个target的值调用Handler的handleMessage方法,也是通过重载这个方法中实现对消息的处理的。Handler的post方法并不是新建一个线程,在post方法中传入的Runnable对象中的run方法中的代码块将被作为替代handleMessage方法来在消息被取出时执行,在源码中Looper是先调用dispatchMessage,在dispatchMessage中会先判断是否有指明callback,如果有则执行callback,而callback即为传入的runnable对象。


Handler通常用来做多线程之间通信,但是Handler不适合用来在Service中是实现的多线程和Activity进行交互,原因是在Activity中定义的Handler实例,没有比较好的方式传入到Serivce中开启的子线程中。尤其是在intentservice中,因为没有onbind类似的方法,intentservice只能从Activity中获取一个Intent类型的数据作为startService的参数。而intent类型数据不适合用来放入Handler实例。而如果将Activity中的Handler设置为static的话,又会出现不能使用Activity提供的一系列方法,也不能使用Activity实例(在使用弱引用的Handler时会出现这种问题)。所以Handler只适合在Activity中直接启用线程进行通信。

Handler解析参考 http://blog.csdn.net/lmj623565791/article/details/38377229

如果要在Serivce中使用Handler和绑定的Activity交互,可以使用Messenger类,通过两个Messenger类来进行交互,而且不能使用intenservice,因为需要普通serivce的onbind类来将service中的Messenger传给Activity,然后Activity可以设置Message类中的replyTo域为自己的Messenger实例,这样就可以实现主线程和子线程都知道对方的Messenger实例,Messenger是封装了Handler功能的,同时还有个getBinder方法可以在onbind中进行传递。

Messenger使用参考 http://www.jianshu.com/p/af8991c83fcb


另外因为消息队列如果不处理完,那么其中的message对handler的引用,而handler往往有对activity或者service的强引用,从而导致对应的组件即使finish了,在内存中依旧不会被回收,所以需要定义自己的handler为静态的内部匿名类,然后在其中定义对组件的的弱引用,通过弱引用的方式调用外部组件的方法之类的。

关于静态Handler的使用参考 http://blog.csdn.net/u011277123/article/details/54090363

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值