在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?(

时间:2022-07-30 14:29:37 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?

在Android中,一个Process 只能使用16M内存,要是超过了这个限定就会跳出这个异常。

那么,开发中,有哪些措施能避免这个问题呢?不仅仅是Bitmap的处理,其他方面也会导致OOM。有哪些好的内存优化方式呢?

以下有几个网友给出的7 个答案可以参考:

Billy Cui ,对Android总体开发和架构一知半解

对于OOM,其实最重要的是注意不要Memory Leak。而Memory Leak是会有多个方面会引起的,比如Drawable, RemoteViews, Receiver, Cursor,InputStream, MediaPlayer等,此外,如果使用JNI也会因为C或C++的代码导致Memory Leak。

除了Memory Leak,大数据量的操作也会导致OOM,比如之前其他回答提到的Bitmap,还有ListAdapter,如果在getView时处理不当,也很容易导致OOM,所以在ListAdapter时应该尽量使用convertView。

最后,可以用android.os.StrictMode以及Eclipse的MAT工具来进行OOM和Memory Leak的检测。

朱磊

我的做法是时间换空间,尽量文件化一些占用内存的数据。最典型的就是ListView中的Bitmap,可以参考这个开源组件的实现。code.google.com/p/androi… 其将Bitmap都本地文件缓存,内存中只保留最近使用的4张图片,在使用中发现还是会偶尔出现OOM,然后我就将其改为完全的读取文件,内存中不保留图片,使用以后都自动回收,由此扩展的数据文件也同样缓存成文件。

除了Bitmap,其他的地方没想到什么能占用这么大内存,网络下载下来的数据文件?需要都留在内存中吗?目前我做的应用,每次请求的数据大小都比较小,每次Http请求下来的数据都把url转换成文件名,然后缓存成文件,在下次Http请求的时候先根据url来预读文件,暂时不用的数据就释放掉。

经常会OOM我觉得就是在Bitmap处理的时候,比如decodeFile,在往界面上加载图片时,不用直接加载原图,可以进行缩放。一张1000*1000的图片要加载到一个100*100的ImageView上,直接加载进来大多数都会OOM,可以先用inJustDecodeBounds

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

拿到这个图片的大小,再算好缩放比例

int scale = 0;

scale = (int)(options.outHeight / (float)size);

if (scale <= 0) {

scale = 1;

}

options.inSampleSize = scale;

options.inJustDecodeBounds = false;

再进行decode。

本文来源:https://www.wddqw.com/doc/0055841f8e9951e79b89278a.html