时间:2021-05-20
前言:
哲学老师说,看待事物无非是了解它是什么,为什么,怎么做
所以,首先,我们先了解一下什么是“内存泄漏”
摘自百度的一段话:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。
是不是有点拗口,换一种说法,有天你去一家饭店吃饭,有个胖子吃完饭了,却霸占着一张桌子不走,然而现在一堆人等着吃饭,结果那死胖子等到饭店打烊了才离开。
在这个例子中,饭店的桌子就好比内存空间,那个胖子就是一个函数,吃饭就是所执行的事件。
这么说是不是好理解多了,现在,我们要做的就是赶走这个死胖子。
Handler在Android开发中经常使用,一不小心就会陷入内存泄漏的问题,最近在开发一款Kotlin软件,针对Handler内存泄漏的问题做出了解决方案
问题分析:
在finish()的时候,Message还没有被处理,Message持有Handler, Handler持有Activity,这样阻止了GC对Acivity的回收,就发生了内存泄露。正确的写法应该是使用显形的引用,静态内部类与 外部类。使用弱引用WeakReference。 最后在Activity调用onDestroy()的时候要取消掉该Handler对象的Message和Runnable
核心代码:
private class MyHandler(activity: thisActivity) : Handler() { private val mActivity: WeakReference<thisActivity> = WeakReference(activity) override fun handleMessage(msg: Message) { if (mActivity.get() == null) { return } val activity = mActivity.get() when (msg.what) { 0-> { } else -> { } } } } override fun onDestroy() { // Remove all Runnable and Message. MyHandler(this).removeCallbacksAndMessages(null) super.onDestroy() }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
关联篇:深入Android的消息机制源码详解-Handler,MessageQueue与Looper关系关联篇:Handler内存泄漏及其解决方
一、概述在Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个App是否存在内存泄漏的问题,本篇将总结典型的内存泄漏的代码,并给出对应的解决方案。内存
前言程序的运行需要内存。只要程序提出要求,操作系统或者运行时就必须供给内存。所谓的内存泄漏简单来说是不再用到的内存,没有及时释放。为了更好避免内存泄漏,我们先介
AndroidHandler的详解Handler我们常常用于通知主线程做相对应的操作,但是如果使用不但的话就会造成内存泄露,所以记录写正确的Handler写法。
内存溢出和内存泄漏的详解及区别内存溢出outofmemory,是指程序在申请内存时,没有足够的内存空间供其使用,出现outofmemory;比如申请了一个int