1.单例模式
频繁使用的对象尽量多应用单例模式,饿汉式跟懒汉式加载。
注意:但是小心单例模式造成的内存泄漏,
比如:
public class DeviceManagerFactory { private static DeviceManagerFactory singleton; private DeviceManagerFactory(Context context){} public static DeviceManagerFactory getInstance(Context context){ if(singleton == null){ synchronized(DeviceManagerFactory.class){ if(singleton == null){ singleton = new DeviceManagerFactory(context); } } } return singleton; }
}那么问题来了,如果是上述对象的引用在activity中引用的话,当我们退出程序时,发现activity并没有被销毁,因为我们在activity中调用该实例时,会传入activity对象,android垃圾回收机制会认为该实例在使用状态,所以退出应用后不会被回收,造成内存泄漏。
我们该如何改呢?
private DeviceManagerFactory(Context context){
this.context = context.getApplicationContext();
}
通过上述修改,我们把该实例的生命周期跟程序应用绑定的话,当程序销毁时,该实例自然会被回收。
2.自动装箱问题
当我们使用数据类型的包装类的时,比如Integer,Float等进行加减时,他会先将包装类转化为int,float等数据类型进行加减(自动拆箱),加减完成之后会进行自动装箱,相当于又重新创建了一个对象,如果是一个for循环操作的话,会加大垃圾回收的压力甚至会anr。
3.慎用容器
如arraylist,hashmap等,它们内部都有自动扩容机制,如果判断容器内部不够使用,那么会扩充为原来的俩倍,导致终端内存占用。
4.activity对象
一.启动模式注意合理应用,默认为standard,每次Intent请求都会重新创建。
二.横竖屏切换都会重新创建activity,onConfigurationChanged重写这个判断
5.注意字符串拼接
如:
String s = "";
for(){
s +=i;
}
像上面那种拼接手法循环几次会初始化几个stringbuffer或stringbuilder,因为拼接说到底都会用stringbuilder来进行拼接,然后赋值。
解决方法:可以先新建一个stringbuilder,然后用stringbuider对象来进行拼接;或者使用string.format来进行。
6.减少布局层级
7.不要滥用线程,这个我会再下一篇着重总结一下线程问题的,请持续关注。
欢迎大家来补充或者建议。