代码优化(一)

来源:互联网 发布:制作圆木桶的算法 编辑:程序博客网 时间:2024/05/16 01:05

1、静态变量引起的内存泄漏

优化代码,需要特别的注意代码中静态变量,静态变量是类相关的变量,他的生命周期从这个类被声明开始,到这个类被垃圾回收器回收才会被销毁,所以在一般的情况下静态变量所在的类被开始使用就一直占据着内存的空间,直到程序退出,如果不注意这些静态变量,静态变量的引用会占用大量内存的资源,造成垃圾回收器无法对内存进行回收,就可能造成内存的浪费。

  private static Resources mResources;
    @Override
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     if (mResources==null) {
   mResources=this.getResources();
  }
    }

如果现在发生Activity被重建(比如横竖屏幕的切换),由于此时Rescourse引用了第一次创建的Activity,就会导致第一次的Activity不能被垃圾回收器回收,从而导致第一次创建的所有对象都不能被回收,这个时候一部分的内存就浪费了。

 

2、使用Application的context

在Android中,Application Context的生命周期和应用的生命周期一样长,而不会取决于某个Activity的生命周期,如果想保存一个长期的声明的对象,并且这个对象需要一个Context,就可以使用Application对象。可以通过调用Context.getApplicationContext()方法或者Activity.getApplication()方法获得Application对象。

private static Resources mResources;
    @Override
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     if (mResources==null) {
   mResources=this.etApplication().getRescourse();


}

}

这样Rescources对象拥有的是Application对象的引用。如果Activity被重新创建,第一次创建的Activity就可以被回收了。

3、及时关闭资源

Cursor是Android查询数据后得到的一个管理数据集合的类。正常的情况下,如果没有关闭它,系统在回收的时候会关闭它,但是这样的效率会特别的低,如果查询得到的数据量较小的时候好可以,如果Cursor的数据量非常大,特别是如果里面有Blob信息时,就可能会出现内存的问题,所以要及时的关闭Cursor

4、使用Bitmap及时调用recyle()

在使用Bitmap对象的时候,需要调用recycle()释放内存,然后将它设置为null。虽然调用recycle并不能保证立即释放占用的内存,但是可以加速Bitmap的内存释放。

在代码优化的过程中,如果发现某个Activity用到了Bitmap对象,却没有显示的调用recycle()释放内存,则需要分析代码逻辑,增加相关的代码,在不使用Bitmap以后调用Recycle()释放内存。

5、对Adapter进行优化

参照convertView   viewHolder对ListView的优化

6、代码的过程的优化

创建新的对象都需要额外的内存空间,要尽量减少创建新的对象

将类、变量、方法等的可见性修改为最小

针对字符串的拼接,要使用StringBuilder代替String

不要再循环中声明临时变量,不要再循环中捕捉异常

如果对于线程的安全没有要求,尽量使用线程不安全的集合对象

使用集合对象,如果事先知道其大小,则可以在构造方法中设置其初始大小

文件读取的操作需要使用缓存类,及时关闭文件

慎用异常,使用异常时会导致性能降低

如果程序会频繁的创建线程,则可以考虑使用线程池


0 0