Fresco使用之OOM问题记录
2024-08-31 06:01:09
最近友盟上5.0以上系统报出很多OOM异常,看下日志看到facebook的时候就知道一定是Fresco使用不当导致了OOM。
java.lang.OutOfMemoryError: Failed to allocate a byte allocation with free bytes and 1426KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:)
at android.graphics.Bitmap.createBitmap(Bitmap.java:)
at android.graphics.Bitmap.createBitmap(Bitmap.java:)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java:)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java:)
at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:)
查资料原来5.0以上Fresco内存会持续增长,所以重新配置了Fresco
//设置内存紧张时的应对措施
MemoryTrimmableRegistry memoryTrimmableRegistry = NoOpMemoryTrimmableRegistry.getInstance();
memoryTrimmableRegistry.registerMemoryTrimmable(new MemoryTrimmable() {
@Override
public void trim(MemoryTrimType trimType) {
final double suggestedTrimRatio = trimType.getSuggestedTrimRatio(); if (MemoryTrimType.OnCloseToDalvikHeapLimit.getSuggestedTrimRatio() == suggestedTrimRatio
|| MemoryTrimType.OnSystemLowMemoryWhileAppInBackground.getSuggestedTrimRatio() == suggestedTrimRatio
|| MemoryTrimType.OnSystemLowMemoryWhileAppInForeground.getSuggestedTrimRatio() == suggestedTrimRatio) {
//清空内存缓存
ImagePipelineFactory.getInstance().getImagePipeline().clearMemoryCaches();
}
}
});
//设置磁盘缓存
imagePipelineConfigBuilder.setMainDiskCacheConfig(DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(getExternalCacheDir())//设置磁盘缓存的路径
.setBaseDirectoryName(getString(R.string.app_name))//设置磁盘缓存文件夹的名称
.setMaxCacheSize(20 * ByteConstants.MB)//设置磁盘缓存的大小
.build())
.setDownsampleEnabled(true)
.setMemoryTrimmableRegistry(memoryTrimmableRegistry);
另外,加载一些大图需要根据View的尺寸缩放图片 (ResizeOptions)
/**
* 构建、获取ImageRequest
* @param uri 加载路径
* @param simpleDraweeView 加载的图片控件
*/
public ImageRequest getImageRequest(Uri uri, SimpleDraweeView simpleDraweeView) {
int width;
int height;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
width = simpleDraweeView.getWidth();
height = simpleDraweeView.getHeight();
} else {
width = simpleDraweeView.getMaxWidth();
height = simpleDraweeView.getMaxHeight();
} //根据请求路径生成ImageRequest的构造者
ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(uri);
//调整解码图片的大小
if (width > 0 && height > 0) {
builder.setResizeOptions(new ResizeOptions(width, height));
}
//设置是否开启渐进式加载,仅支持JPEG图片
builder.setProgressiveRenderingEnabled(true);
return builder.build();
}
目前想到的从这两方面避免OOM,结果还是要看友盟的统计~
BY LiYing
最新文章
- 关于iBatis.NET连接各数据库时提示没找到数据库驱动的依赖文件
- 兼容ie7、8、9、10、FF、Chrome的遮罩显示
- 读jQuery源码 - Callbacks
- Linux 休眠,挂起(待机),关机等几个命令的区别及如何实现;如何启用Ubuntu的休眠模式
- android 学习随笔二十四(动画:帧动画)
- cout 计算顺序问题
- PHP读取文件内容的三种方式
- C语言读写伯克利DB 3
- Android中对手机文件进行读写
- Documentation | AnsibleWorks
- 了解 : angular controller link ng-init 顺序
- Kubernetes DNS 简介
- 【酷我天气】完整的天气App项目
- 引入外部 CDN失效时--怎么加载本地资源文件(本文以jquery为例)
- nginx rewrite 实现URL跳转
- 聊聊call、apply、bind的故事
- shell 学习笔记一
- codeforces445A
- 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集
- Proxy源代码分析——谈谈如何学习Linux网络编程