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
- Android进阶—内存优化
- Android进阶—图片内存优化
- Android高手进阶——Android内存性能优化
- Android高手进阶——Android内存性能优化
- Android高手进阶——Android内存性能优化
- Android内存优化神器——MAT使用进阶
- Android 内存泄漏及优化防止OOM——进阶必看篇
- Android内存优化之二:MAT使用进阶
- Android内存优化之二:MAT使用进阶
- Android内存优化之二:MAT使用进阶
- Android内存优化之二:MAT使用进阶
- Android进阶#(6/12)让程序更优的技术——性能优化_内存优化
- Android进阶——性能优化——内存泄漏检测——eclipse使用 leakcanary AS使用leakcanary
- Android进阶#(6/12)让程序更优的技术——性能优化_内存泄漏
- Android性能优化——内存优化
- 性能优化——Android内存优化
- Android性能优化——内存优化
- Android性能优化——内存优化
- The Swift Programming Language 中文翻译
- 手机领域又来了一个搅局者
- Makefile的编写
- MySQL关系数据库
- deep learning实践经验总结2--准确率再次提升,到达0.8,再来总结一下
- Android进阶—内存优化
- 关于推送
- JVM常用的调优参数
- 简单易学的机器学习算法——分类回归树CART
- 49_leetcode_Longest Valid Parentheses
- 向量相似度度量(一):EMD (Earth Mover's Distance)
- 笔记
- socket中的TIME_WAIT状态
- makefile 的ifeq和ifdef的区别