原本以为android内存泄露会是大牛才该解决的问题。可是公司就我一个Android啊,代码都是你写的啊,工具持续用一个小时就开始卡顿了,甚至崩溃,你不解决谁解决啊。
于是乎,开始查什么叫内存泄露,内存溢出。看了一大堆文章不是我想要的。从解决结果来说,程序中存在不合理的代码,比如handler,计时器,注册的服务广播什么的没关闭,导致activity关闭的时候,资源没有被系统回收,内存没有被释放,反复操作,内存占用越来越多,知道逼近系统分配给你应用的最大内存,程序开始卡顿,直至崩溃。
那么接下来有几个问题,问题1,一般应用在android studio中的memory应该是多少呢,我测试我的软件是启动8M多一点,打开两三个界面后到16M左右,设备是专用测量设备南方x2,然后打开内存泄露那个界面,关闭后到达20M,反复打开关闭,最终好像有40M,不过我也没耐心测试一个小时,既然知道了这里内存异常了。附as查看应用占用内存情况
然后,开始百度搜索(用百度会不会被用google的鄙视)如何解决内存溢出。最终锁定leakcanary。gradle引用
debugCompile'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
application中添加
private RefWatcher mRefWatcher;
public voidonCreate() {
mRefWatcher= LeakCanary.install(this);
}
public static RefWatcher getRefWatcher(Context context){
MyApplication baseApplication = (MyApplication) context.getApplicationContext();
return baseApplication.mRefWatcher;
}
然后在BaseAcitivity(没有封装一层直接在每个activity中)的ondestroy中添加MyApplication.getRefWatcher(this).watch(this);
然后运行程序就好了,当关闭activity时有内存泄露的话,屏幕上会有个弹窗提示,然后可以去系统通知栏查看。或者你会发现你多了一个应用程序leaks,打开后发现
然后发现一个activity4.5M内存泄露,惊不惊喜,意不意外,年幼无知的我还不知道4.5M是什么概念,直到我测试出别的界面有内存泄露,不过是100K,13k的时候,我才意识到这个4.5M,真尼玛大啊。然后看错误,第一反应数据库操作cursor没有及时关闭,editTextWatche只是add了,我以前从来不知道还需要remove啊。然后进行了查找cursor有没有没关闭,remove了textwatcher。再次运行依然这几处地方报错,日了uzi了。后来故意在一个界面不关闭游标,运行,竟然没有报数据库的错误。最终折腾了一下午,掉到这两个地方有错误的圈里出不来了,也没解决问题。不过后来再改别的地方是发现一个计时器没有管,联想到了这个界面有个自定义动画,果然,这里也有个计时器没关闭,然后关闭了。运行没有内存溢出了。现在程序稳稳的13M左右运行。问题来了,为什么没有直接指出计时器导致的内存泄露,而是指向这么一些没有真正错误的东西,还有这个东西该怎么读啊?