Android进阶—内存优化

来源:互联网 发布:蓝月传奇英雄翅膀数据 编辑:程序博客网 时间:2024/04/30 15:25

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)的引用,造成内存泄露,资源造成得不到释放。

0 0
原创粉丝点击