天天看点

android中常见的内存泄漏和解决的方法

android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢。事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了。

写在前面的一点儿想法:工作做完了事实上不会的还有非常多,每天都有莫名的危机感,从真正写代码的这一年多总认为自己的学习速度比别人的慢非常多

当某些对象不再被程序所使用。可是这些对象仍然被某些对象所引用着。进而导致垃圾收集器不能及时释放它们。

(无效的对象没有及时回收。导致内存不够用。致使程序

出错)

来个图片了解一下

知道为什么导致内存泄露那就非常好办了。都是跟对象有关系(就是new出来的 不要想着他会跟你结婚)

主要有以下几方面吧:平时注意一下 全然能够杜绝的

Context

内部类(handler等)

Cursor

Adapter

Bitmap

来个图让大家分分钟理解一下:

看到这个图在稍加思索会不会认为我们的工具类 貌似好多都持有了activity,并且工具类还是static类型。

在细琢磨一下呢。是不是activity的上下文都能够被application替代呢?

经验之谈:dialog ,fragment。inflate和启动activity 的上下文都是activity的。其它的都都能够被application替代。比方数据库的 服务的 广播的。都不要再用activity了吧。

当然也要酌情处理。

举个栗子(太多了根本举只是来)

1.获取系统的服务

2.弄个数据库

其它的就是 千万不要在 static的工具类里面 增加activity上下文

简单说一下呢:比方 activity 开线程 跳刀handler 弹出dialog。 activity在销毁了,thread持有activity。然后跳到了handler,handler的对象也存在着了对吧,然后弹出dialog。这个时候呢dialog也持有了activity。可是由于activity销毁了所以不弹了。但对象还是持有者了。

怎么解决 内部类的问题呢。就是在 依附于的那个类销毁的时候 自己也销毁。

就相似于activity销毁了。什么thread,dialog。handler全关掉

handler的情况

切断联系即可啦。

- dialog

刚才说的按个 activity都销毁了。

可是还要在handler中运行dialog。那么久做个推断吧

thread 和asynctask的情况

在写这个的时候我就在想我还有必要写么。

我都已经太久远的没用这两个了。

我都用的是线程池了。

以下贴一个自己定义的线程池代码。读者直接拿走(能够用 线程池+handler 或者 线程池+eventbus,rxbus等等来更新ui),activity销毁的事后 直接让线程池关闭即可啦

广播

… has leaked IntentReceiver … Are you missing a call to unregisterReceiver()?

这个错误我们如今公司的代码还有大把的了。

这么解决,一个大神的方法

接下来的几个感觉大家应该都不会出太大的问题吧

不用的时候调用 recycle(),把他清理掉

也能够用lrucache等方法,这就不做具体介绍。

转载请注明:http://blog.csdn.net/wanghao200906/article/details/50426881

就这样吧。忙里偷闲写了个博客,总结一下,事实上内存溢出的问题都是 不小心导致的,避免起来也比較easy。

文章有点儿长 读完了 :辛苦了您內,0基础文章大神勿喷