android常用优化方案

一,性能优化:

1:优化Dalvik虚拟机的堆内存。(此方法在2.2以上版本不再提供)

float TARGET_HEAP_UTILIZATION = 0.75f; 

在程序onCreate时就可以调用

VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

此方法可以增强程序堆内存的处理效率。

2:强制定义自己软件的堆内存大小(此方法在2.2以上版本不再提供)

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//设置最小heap内存为6MB大小

3,图片处理

BitmapFactory.Options options =new BitmapFactory.Options();
options.inSampleSize =2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri),null, options);
bitmap.recycle();  //回收释放内存

4:UI优化

     1),尽量利用系统定义的id  比如:android:id="@android:id/list" //可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小
     2),尽量使用android系统的图片资源
        android:icon="@*android:drawable/ic_menu_attachment"(注意这里的*不能省略,因为Android中没有公开的图片资源,在xml中直接应用会报错)
     3),尽量使用android的字符串资源
       android:text="@android:string/yes"    android:text="@android:string/no"这样既节省空间,而且直接支持字符串国际化。
     4),使用系统的Style
        android:textAppearance="?android:attr/textAppearanceMedium"
     5),使用系统的颜色资源
        android:background ="@android:color/transparent"
        Android系统本身有很多资源在应用中都可以直接使用,具体的,可以进入android-sdk的相应文件夹中去查看。例如:可以进入$android-sdk$\platforms\android-8\data\res,里面的系统资源就一览无余了。
     6),重复的布局用include标签重用Layout
     7),在初始化状态下不需要显示的布局使用ViewStub标签。
            
ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当ViewStub被设置为可见,或者调用inflate()函数时,才会真的去加载这个布局资源文件。该ViewStub在加载视图时会在父容器中替换它本身。因此,ViewStub会一直存在于视图中,直到调用setVisibility(int)或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。同样,也可以通过使用inflated Id属性来定义或重命名要加载的视图对象的Id值。
8),在编写布局时,尽量少的重叠背景,过多的背景颜色重叠会导致过度绘制(Overdraw影响性能)。比如某个Activity有一个背景,然后里面 的Layout又有自己的背景,同时子View又分别有自己的背景。

二,代码优化

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

2,资源及时回收,比如cursor.close(); bitmap.recycle();

3,程序中为了满足需求必须使用Context时 尽量使用Application Context,因为Application Context的生命周期比较长,应用他不会导致内存泄露。

4,在ListView中不要使用线程,因为线程的生命周期不可控。

5,在比较占用内存的地方,比如图片的使用,尽量使用软应用和弱应用。

定义一个HashMap ,保存软应用对象         
private Map> imageCache = new HashMap>();

再来定义一个方法,保存Bitmap的软应用到HashMap;
public void addBitmapToCache(String path) {
     // 强引用的Bitmap对象
    Bitmap bitmap = BitmapFactory.decodeFile(path);
    // 软引用的Bitmap对象
    SoftReference softBitmap =new SoftReference(bitmap);
    // 添加该对象到Map中使其缓存
    imageCache.put(path, softBitmap);
}
获取的时候,可以通过SoftReference的get()方法得到Bitmap对象
public Bitmap getBitmapByPath(String path) {
    // 从缓存中取软引用的Bitmap对象
    SoftReference softBitmap = imageCache.get(path);
    // 判断是否存在软引用
    if(softBitmap ==null) {
        return null;
    }
    // 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空
    Bitmap bitmap = softBitmap.get();
    return bitmap;
}

使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。

你可能感兴趣的:(android常用优化方案)