(1)、避免基本数据类型数据被无故自动装箱,因为自动装箱会创建新的对象,导致频繁的gc操作,造成内存的泄漏,解决方法是保持类型的一致性。
(2)、在数据量小的键值对集合中使用arrayMap或者sparseArray替换hashmap,因为hashmap要求对象作为键值对,存在自动装箱问题引发的内存问题,而arrayMap或者sparseArray会更高效的使用内存,占用的内存都比hashmap小,但是arraymap或者sparseArray花费在检索项目和分配空间的时间会比 hashmap长,不过在arraymap或者sparseArray的项目数量少于1000的情况下执行花费的时间差不多,所以对于项目数据量少的会选择消耗内存少的arraymap或者sparseArray代替Hashmap。
(3)、避免上下文Context导致的activity的内存泄漏,很多api操作都需要传递Context对象,一般用activity作为context传递,而当指向activity的引用被缓存了,而该对象的生命周期要比activity的生命周期长,导致的activity内存泄漏。
(4)、避免使用非静态的内部类,因为当创建了一个非静态的内部类的对象,就隐含的创建了外部类的一个强引用实例,如果这个实例的生命周期比外部类的长,即使不需要这个外部类型,它还是会保存到内存中,比如在activity中扩展了一个非静态的asynctask,开始执行异步任务,运行过程中杀掉了activity,由于activity被asynctask所引用,无法及时被回收,导致内存泄漏。
(5)、使用第三方提供的框架检测内存的泄漏问题,比如LeakCanary开源框架。使用studio自带的memory工具检测内存变化。
2、layout的优化,可以使用android sdk tool提供的层级观察器(Hierarchy Viewer)观察activity的布局。
3、避免过度绘制,什么是过度绘制,比如系统默认有一个默认的主题颜色,可以通过主题或者代码的方式将这个背景设置成空。比如listview和他的item可以选择的是只给listview设置背景还是只给item设置背景,这样就减少了一层的绘制,提升性能。
4、避免使用setAlpha来设置透明度,避免了系统会先在离屏缓存上绘制的问题。
5、使用系统提供的Traceview,Traceview 是一个性能分析工具,能帮助我们检测有哪些方法太耗时。
使用方法:在想要观察的开始和结束位置(如activity的onResume和onPause)分别调用 Debug.startMethodTracing("保存的路径全名") 和 Debug.stopMethodTracing();从保存的路径中获取到trace文件,使用traceView 命令查看该文件,检测有哪些方法太耗时。