Android-内存优化的几点建议

187 阅读2分钟
  1. 数据类型(不要使用比需求更占空间的基本数据类型)
  2. 循环尽量用foreach,少用iterator,自动装箱尽量少用
  3. 数据结构与算法的优化处理
  • 数据量千级以内可以使用Sparse数组(key为整数),ArrayMap(key为对象)虽然性能不如HashMap但节约内存
    
  1. 枚举优化
枚举的缺点:
1.   每一个枚举值都是一个单例对象,在使用它时会增加额外的内存消耗,所以枚举相比与 IntegerString 会占用更多的内存
2.   较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的IO开销,使我们的应用需要更多的空间
3.   特别是分dex多的大型APP,枚举的初始化很容易导致ANR
枚举优化的例子:
public class SHAPE {
    public static final int RECTANGLE=0;
    public static final int TRIANGLE=1;
    public static final int SQUARE=2;
    public static final int CIRCLE=3;


    @IntDef(flag=true,value={RECTANGLE,TRIANGLE,SQUARE,CIRCLE})
    @Target({ElementType.PARAMETER,ElementType.METHOD,ElementType.FIELD})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Model{

    }

    private @Model int value=RECTANGLE;
    public void setShape(@Model int value){
        this.value=value;
    }
    @Model
    public int getShape(){
        return this.value;
    }
}

  1. 字符串的连接尽量少用+
  2. 重复申请内存的问题
    同一个方法多次调用,如递归函数 ,回调函数中new对象,读流直接在循环中new对象等
    不要在onMeause()  onLayout() onDraw()  中去刷新UI(requestLayout)
  1. 避免GV回收将来要重用的对象
  2. activity组件泄漏
1.     非业务需要不要把activity的上下文做参数传递,可以传递application的上下文
2.     和activity有关联的对象写出static
3.     非静态内部类和匿名内部类会持有activity引用(建议大家单独写个文件)。可以使用弱引用处理
4.     单例模式持有activity引用
5.     handler PostDelayed问题。如果开启的线程需要传入参数,用弱引用可以解决问题。handler记得清除
6.     removeCallbackAndMessage(null
  1. 尽量使用IntentService而不是service