Android的内存优化方案:
基本上所有面试都会遇到这样的问题,关于内存的优化方案;
所以想了想自己以前做的项目,并参考了其他的资料,进行了整理。
1、static
它的生命周期是很长的, 引用一些资源耗费过多的实例(Context的情况最多);
第一,应该尽量避免static成员变量引用资源耗费过多的实例,比如Context。(View中是包含Context的引用的);
第二、Context尽量使用Application Context,因为Application的Context的生命周期比较长,引用它不会出现内存泄露的问题。
第三、使用WeakReference代替强引用。
2、线程:
横竖屏切换时,线程会重新启动,并会保留原有的线程;
AsyncTask内部的实现机制是运用了ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的;第一、将线程的内部类,改为静态内部类;
第二、在线程内部采用弱引用保存Context引用。
public abstract class WeakAsyncTaskProgress, Result, WeakTarget> extends
AsyncTaskProgress, Result> {
protected WeakReference mTarget;
public WeakAsyncTask(WeakTarget target) {
mTarget = new WeakReference(target);
}
@Override
protected final void onPreExecute() {
final WeakTarget target = mTarget.get();
if (target != null) {
this.onPreExecute(target);
}
}
@Override
protected final Result doInBackground(Params... params) {
final WeakTarget target = mTarget.get();
if (target != null) {
return this.doInBackground(target, params);
} else {
return null;
}
}
@Override
protected final void onPostExecute(Result result) {
final WeakTarget target = mTarget.get();
if (target != null) {
this.onPostExecute(target, result);
}
}
protected void onPreExecute(WeakTarget target) {
// No default action
}
protected abstract Result doInBackground(WeakTarget target, Params... params);
protected void onPostExecute(WeakTarget target, Result result) {
// No default action
}
}
3、Bitmap:
保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制;
第一、及时的销毁;在用完Bitmap时,要及时的recycle掉。recycle并不能确定立即就会将Bitmap释放掉,
但是会给虚拟机一个暗示:“该图片可以释放了”。
第二、设置一定的采样率;
第三、巧妙的运用软引用(SoftRefrence);有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。
这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。
4、Cursor:
及时关闭Cursor,如果Cursor的数据量特表大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。
5、代码微优化:
第一、创建新的对象都需要额外的内存空间,要尽量减少创建新的对象;
第二、将类、变量、方法等等的可见性修改为最小;
第三、针对字符串的拼接,使用StringBuffer替代String;
第四、不要在循环当中声明临时变量,不要在循环中捕获异常;
第五、如果对于线程安全没有要求,尽量使用线程不安全的集合对象;
第六、使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小;
第七、文件读取操作需要使用缓存类,及时关闭文件;
第八、慎用异常,使用异常会导致性能降低;
第九、如果程序会频繁创建线程,则可以考虑使用线程池。
6 、UI优化:
Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小;
利用系统定义的id(android:id="@android:id/list"),字符串资源,Style,颜色定义等。
7、使用软引用和弱引用:
第一、软引用:如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存;
第二、弱引用:如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
8、adapter中的缓存优化,广播的关闭,流的关闭;
9、其他:
第一、不要使用整张整张的图,尽量使用9path图片。Adapter要使用convertView等等;
第二、长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。