Handler 学后总结

首先  Handler他还是一个工具类,是子线程和主线程之间的关联通道。

由于主线程中不能进耗时操作【子线程可以】,而子线程中又不能进行更新操作【只能在主线程中进行更新,并且在子线程中更新的顺序也不能确定】所以,我们使用了handler将主线程和子线程联系在一起进行一些类的操作。不过也有例外,在Porgressbar中可以在子线程中进行更新,原因实际上在底层代码中还是由主线程进行更新的!

通过handler机制可以将子线程中的加工好的信息进行发送给Message Queue [消息队列: 它是用来储存子线程发送给主线程的Message] 在通过looper [消息泵,一个线程中只有一个消息泵。 将储存在新消息队列里的由子线程发送过来的消息 泵送到]主线程中的handler进行处理由此两者得到了联系。

handler.sendMessage()方法将信息发送到消息队列,MessageQueue.Looper()死循环读取MessageQueue中的Message,之后再将读取到的Message给了handler.dispatchMessage();而这个方法里面调用了handlerMessage()方法。在子线程中怎么使用handler? : Looper.prepare();  handler = new Hnadler();[创建一个handler对象]  Looper.loop();{让Looper循环起来}。

而在Handler中很容易造成内存泄漏,官方要求应在Handler前加上 Static 声明称静态的。不过也有些小麻烦,就是在静态的方法中拿不到非静态的对象。所以要在静态方法外进行静态的声明,并且在onCreate方法中进行变量赋值。【只是为了减少内存泄露】!

并且当Handler发送延时消息时也会产生内存泄漏{前提条件是:横竖屏切换几次后},在横竖屏切换的时候{在没有被写死的情况下},activity就会销毁并重新创建。结果就是会出现内存泄漏。原因在于Activity销毁重建的过程,当activity销毁的时候Handler也就要被销毁,而Hanlder销毁的条件就是不能有任务或者是消息存在。由于此时的Handler发送的是延时消息那么就肯能会出现,所以handler就销毁不了而他对activity又持有引用导致activity调用了inDestroy()的方法却没有销毁的事实。就产生了内存泄漏。

解决方法其实很简单只要在onDestroy()方法内添加一条代码handler.removeCallbacksAndMessages(null);就是不管handler中有没有任务或者消息全部销毁清空,就可以正常的销毁activity了也就不会再出现内存泄漏了。

  顺便说一下下内存泄漏和内存溢出的最大原因:

内存泄漏的原因有关于: handler,   Cursor,   file

内存溢出的原因有关于: 在android中的Bitmap的使用{也就是在加载图片的时候出现}

感谢亲临,希望大牛们多提意见多多关照!!微笑我会再接再厉,继续努力奋斗下次见!!再见

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值