本文主要是介绍从This Handler class should be static or leaks might occur!警告说起,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对于接下来讨论的问题,首先需要弄明白一个问题就是什么是内存泄漏:一般来说内存泄漏有两种情况。一种情况如在C/C++ 语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在 Java 中已经由于垃圾回收机制的引入,得到了很好的解决。所以Java 中的内存泄漏,主要指的是第二种情况。
首先我们来理解这个警告(This Handler class should be static or leaks might occur),该警告是告诉我们内存会泄露,到底是怎么泄露的呢?!我们还是用个简单的例子来说明吧。
该图表示的是现在所报的警告
现在我们用个实例来说明警告的具体解释是怎样的!
首先我构建了一个内部类MsgHandler, 内部类实例保存了一个对其外部类实例的引用,你不需要通过new的方式生成一个,获得该引用的方法是MainActivity.this(即外部类名.this),并且该引用是强引用(这里就涉及到你需要去了解下java机制里面的引用中所涉及到的强引用,弱引用,以及随机引用的具体内容).
其次是,当我使用MsgHandler实例的sendMessage方法的时候,会把消息发送到主进程的详细队列里面去,在sendMssage发送的消息里面包含对该MsgHandler实例的引用,所以主进程的消息队列里也就有了对MsgHandler实例的引用。
如果出现这种场景就可能会内存泄露,当发送到消息队列的消息还没来得及处理,而此时MainActivity的已经不需要再使用了,调用finish()方法,来结束期生命周期,可此时在消息队列里还有一条消息没有处理,并且此条消息包含这个MsgHandler实例的引用,所以这个MsgHandler的实例还是可以触及的对象,所以其还不能被回收,又因为该MsgHandler实例包含了MainActivity 的强引用,所以其也不能被回收,就造成了内存泄漏。
解决该问题:通过弱引用的方式来解决该问题。
这里呢我们先通过该篇文章来解释下java的各种引用.
http://www.cnblogs.com/theo/p/6443493.html
这篇关于从This Handler class should be static or leaks might occur!警告说起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!