Android内存优化

来源:互联网 发布:免费的域名需要备案吗 编辑:程序博客网 时间:2024/06/06 02:22
1、平时在访问一个属性的时候效率远比访问一个固定变量低。假设xxx.GetLength()方法的值一般大于5.
比如 for(int i=0;i<xxx.GetLength();i++)
这里的xxx.GetLength()在每次循环的时候都执行,影响效率,游戏开发的时候尤其明显。
改进的方法应该为
int j = xxx.GetLength();
for(int i=0; i<j;i++)

2、对于字符串而言,如果需要连加String,则最好用StringBuilder。如果你的字符串每次连加,String的开销远大于StringBuilder。

3、图片的优化:2维图像处理库BitmapFactory。为了减少文件体积,提高效率,常常不用很多资源文件,而是把很多小图片放在一个图片中,由切片的方式来完成。

4、资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。

5、构造Adapter时,没有使用缓存的 convertView
  以构造ListView的BaseAdapter为例,在BaseAdapter中提共了方法:
public View getView(int position, View convertView, ViewGroup parent)来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。
  由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费时间,也造成内存垃圾,给垃圾回收增加压力,如果垃圾回收来不及的话,虚拟机将不得不给该应用进程分配更多的内存,造成不必要的内存开支。ListView回收list item的view对象的过程可以查看:
view plaincopy to clipboardprint?
android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。

6、static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context的情况最多),这时就要谨慎对待了。
public class ClassName {        private static Context mContext;        //省略  }
以上的代码是很危险的,如果将Activity赋值到么mContext的话。那么即使该Activity已经onDestroy,但是由于仍有对象保存它的引用,因此该Activity依然不会被释放。

0 0
原创粉丝点击