最近友盟上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

最新文章

  1. 关于iBatis.NET连接各数据库时提示没找到数据库驱动的依赖文件
  2. 兼容ie7、8、9、10、FF、Chrome的遮罩显示
  3. 读jQuery源码 - Callbacks
  4. Linux 休眠,挂起(待机),关机等几个命令的区别及如何实现;如何启用Ubuntu的休眠模式
  5. android 学习随笔二十四(动画:帧动画)
  6. cout 计算顺序问题
  7. PHP读取文件内容的三种方式
  8. C语言读写伯克利DB 3
  9. Android中对手机文件进行读写
  10. Documentation | AnsibleWorks
  11. 了解 : angular controller link ng-init 顺序
  12. Kubernetes DNS 简介
  13. 【酷我天气】完整的天气App项目
  14. 引入外部 CDN失效时--怎么加载本地资源文件(本文以jquery为例)
  15. nginx rewrite 实现URL跳转
  16. 聊聊call、apply、bind的故事
  17. shell 学习笔记一
  18. codeforces445A
  19. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集
  20. Proxy源代码分析——谈谈如何学习Linux网络编程

热门文章

  1. Admin站点
  2. 684. Redundant Connection
  3. HDU1272小希的迷宫
  4. HDU5952 Counting Cliques 暴搜优化
  5. vs code 快捷键总结
  6. [转]jQuery DOM Ready
  7. python 学习分享-装饰器篇
  8. sqlserver 表值函数
  9. linux基础(基本命令)
  10. UVALive 5099 Nubulsa Expo 全局最小割问题