Android中需要手动关闭的地方
在安卓开发中我们都知道,内存申请了就要释放,对象创建了就要回收,初级工程师或者说新手往往在 打开/申请 完某个资源之后,忘记手动关闭,而java和android提供的虚拟机往往不是什么都会自动回收的,当比如网络和文件的io流、Bluetooth、GPS、Cursor,线程等,这时如果不手动回收资源,就会造成系统资源浪费。
new
在activity中,并不是所有new出来的资源都需要管,不涉及系统资源的在java中是不要管的,强引用置null一般是内存到峰值的时候才会有一点用。一般在activity被finish掉的时候,其对应的成员变量也会被置空,从而会被清理掉!如果其对应的数据没有被其他对象引用的话,对应的数据所占空间也会被jvm自动回收掉!不需要去做相关的释放
数据库连接:
一般来说,数据库连接在使用完毕后最好是要关闭一下的,对象A 在事务提交 用完后,db 是要及时关闭的 否则其他对象要引用同一个db对象 会照成db对象被A占用的异常 导致以后执行事务提交不能被正常提交,有人会说,我用的单例模式,只有一个DB对象…这样的话…我不是说“最好”关闭一下嘛。再者,每次数据连接查询后,缓存中都会有积累一些旧数据,每次事务提交后,关闭也可以清空缓存。总之,关总比不关好,何必徒增烦恼呢?
Bitmap
4.0之前的Bitmap数据放在native空间,虚拟机只能回收java层的对象,所以必须主动recycle。
4.0之后的Bitmap数据在虚拟机中,所以不必主动释放。
try…finnaly…
为了尽量避免申请资源没释放的情况发生,所以通常要求将打开操作放到try中,关闭操作放到finnaly中。
但能否使用这种设计还要看具体的业务场景,有得时候try…finnaly…会让设计变得很复杂,甚至有些业务场景完全无法简单的套用try…finnaly…。所以这种要求只能说尽量做到,不能强求。
减少对象内存占用:
1.使用轻量数据结构
2.少用ENUM:比static变量占用内存多几倍
3.减少bitmap内存占用:预加载宽高(inJustDecodeBounds=true),缩小size(缩小2的inSampleSize次幂),改解码方式(一般不太方便),ARGB_8888一个像素32位,换成其他的,但是图片颜色,清晰度什么的会受影响。
内存对象复用:
1.bitmap:LRUCache
2.listview:item view
3.recyclerview:view holder
4.避免在onDraw()等频繁执行的方法内创建对象
5.stringbuilder/stringbuffer
减少内存泄漏
1.优先用application context代替activity context。
2.handler:onDestroy()之前remove掉消息队列中的消息和runnable对象,或者static加weakReference引用外部类。 引用链如下:looper->messagequeue->message->handler->outter class
3.listener的注销
4.cursor,connection关闭。
5.容器中对象泄露。