Picasso OOM浅谈。
2016-06-03 15:51
381 查看
自从项目图片加载从ImageLoader换成了Picasso,很久没有担心过OOM的问题了。不过最近在三星Note2发现加载大图的时候出现了OOM,通过解决了这个问题,把Picasso的理解又加深了一层。于是今天简单记录一下造成OOM的原因和解决方法。
场景1、
在ListView里面,piscasso加载图片,不用担心复用问题,可是假如ImageView是100*100,而图片是1000*1000,他是把1000*1000的图片加载到100*100里面,如果图片多了,就会很容易造成oom,所以在picasso在加载图片的时候,如果imageview规定了宽高,一定要记得使用resize。
场景2、列表点击缩略图弹dialog显示大图
一般单张大图是不容易造成OOM的,如果会也要resize。在这是ListView列表中的缩略图,点击之后创建一个dialog,然后dialog里面有个大Imageview来显示列表中的ImageView,但是点击多个缩略图,就生成了多个dialog,而显示的ImageView没有回收资源,所以也会造成OOM。所以在再次点击dialog,让它消失的时候回收资源(一个dialog,显示不同的图片,没有回收资源也会OOM)
解决方法:
暂时内容记录到这里,如果遇见其他的OOM问题会再次更新。
场景1、
在ListView里面,piscasso加载图片,不用担心复用问题,可是假如ImageView是100*100,而图片是1000*1000,他是把1000*1000的图片加载到100*100里面,如果图片多了,就会很容易造成oom,所以在picasso在加载图片的时候,如果imageview规定了宽高,一定要记得使用resize。
Picasso.with(context.getApplicationContext()).load(url) .resize(width, height) .into(imageView); 或 Picasso.with(context.getApplicationContext()).load(url) //从dimen里面取 .resizeDimen(targetWidthResId, targetHeightResId) .into(imageView);
场景2、列表点击缩略图弹dialog显示大图
一般单张大图是不容易造成OOM的,如果会也要resize。在这是ListView列表中的缩略图,点击之后创建一个dialog,然后dialog里面有个大Imageview来显示列表中的ImageView,但是点击多个缩略图,就生成了多个dialog,而显示的ImageView没有回收资源,所以也会造成OOM。所以在再次点击dialog,让它消失的时候回收资源(一个dialog,显示不同的图片,没有回收资源也会OOM)
解决方法:
/** * 清空图片的内存 */ public static void clearImgMemory(View V) { if(V instanceof ImageView) { Drawable d=((ImageView)V).getDrawable(); if(d!=null&&d instanceof BitmapDrawable) { Bitmap bmp=((BitmapDrawable)d).getBitmap(); bmp.recycle(); bmp=null; } ((ImageView)V).setImageBitmap(null); if(d!=null){ d.setCallback(null); } } }
//imageview是dialog中的大图ImageView,再次点击隐藏对话框 imageview.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); BitmapUtil.clearImgMemory(imageview); System.gc(); } });
暂时内容记录到这里,如果遇见其他的OOM问题会再次更新。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories