Android中需要手动关闭的地方

在安卓开发中我们都知道,内存申请了就要释放,对象创建了就要回收,初级工程师或者说新手往往在 打开/申请 完某个资源之后,忘记手动关闭,而java和android提供的虚拟机往往不是什么都会自动回收的,当比如网络和文件的io流BluetoothGPSCursor线程等,这时如果不手动回收资源,就会造成系统资源浪费。

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…。所以这种要求只能说尽量做到,不能强求。

oom避免方法总结

减少对象内存占用:

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.容器中对象泄露。

更多相关文章

  1. [Android] 缓存机制
  2. android手机开发课小结
  3. Android(安卓)中使用 dlib+opencv 实现动态人脸检测
  4. Android内存泄漏检测及修复(转载)
  5. 09-Garbage Collection in Android
  6. Android(安卓)面试题002 android的Handler机制
  7. LeakCanary:检测Android中的内存泄漏
  8. [Android]用户界面设计
  9. Android官方推荐全局对象传递数据

随机推荐

  1. Android中EditText输入字数统计和限制
  2. Android进阶---Android(安卓)Webview重定
  3. Android布局文件的加载过程分析:Activity
  4. Android(安卓)访问WebService
  5. Android(安卓)仿百度网页音乐播放器圆形
  6. android SQLite 优化(三)使用事务 优化 ins
  7. Android(安卓)面试题集 包含答案
  8. eclipse编译cocos2d-x2.2.6的Android
  9. Android(安卓)Studio导入项目app module
  10. Android动画介绍汇总