Android利用ViewPager实现图片浏览,解决内存问题
来源:互联网 发布:无锡java培训机构 编辑:程序博客网 时间:2024/06/06 07:43
在Android开发中,我们经常遇到利用Viewpager实现图片浏览的需求,这个很好实现,也没什么技术难点,但是最近我在实现这个功能的时候,遇到了一些问题,当图片数量稍微多点时,一直滑动浏览,会导致内存占用一路走高,最终导致oom,在分析了只有,发现是因为viewpager中给的ImageIView一直在新建导致的内存溢出,最后找到了解决方法,让view实现复用,解决了内存问题,代码也比较简单,复写viewdaptaer的instantiateItem()方法,代码如下
public class CarImagesBrowseAdapter extends PagerAdapter { private ArrayList<String> mDatas;//数据源 private LinkedList<View> mViewCache;//缓存view private Context mContext; private int mChildCount; public CarImagesBrowseAdapter(Context context, ArrayList<String> arrayList) { this.mContext = context; this.mDatas = arrayList; mViewCache = new LinkedList<>(); } @Override public void notifyDataSetChanged() { mChildCount = getCount(); super.notifyDataSetChanged(); } @Override public int getCount() { return this.mDatas.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public int getItemPosition(Object object) { if (mChildCount > 0) { mChildCount--; return POSITION_NONE; } return super.getItemPosition(object); } @Override public Object instantiateItem(ViewGroup container, int position) { View convertView = null; if (mViewCache.size() == 0) { PhotoDraweeView draweeView = new PhotoDraweeView(mContext); draweeView.setBackgroundColor(0xff000000); convertView = draweeView; } else { convertView = mViewCache.removeFirst(); }
//这里我是用Facebook的Fresco加载的图片,你可以在这里换成你使用的图片加载方式 final PhotoDraweeView view = (PhotoDraweeView) convertView; PipelineDraweeControllerBuilder controller = Fresco.newDraweeControllerBuilder(); controller.setUri(Uri.parse(Constants.PICTURE_HOST + mDatas.get(position))); controller.setOldController(view.getController()); controller.setControllerListener(new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { super.onFinalImageSet(id, imageInfo, animatable); if (imageInfo == null) { return; } view.update(imageInfo.getWidth(), imageInfo.getHeight()); } }); view.setController(controller.build()); container.addView(convertView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); return convertView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { View contentView = (View) object; container.removeView(contentView); this.mViewCache.add(contentView); }}
代码也比较简单,相信大家也都能看懂!
阅读全文
1 0
- Android利用ViewPager实现图片浏览,解决内存问题
- android 解决ViewPager加载大量图片内存溢出问题
- android ViewPager 图片浏览和保存图片
- 基于ViewPager实现大量图片浏览功能
- 基于ViewPager实现大量图片浏览功能
- android Gallery 3D 倒影图片浏览 解决oom问题
- Android之利用Viewpager实现图片的轮播效果
- 利用ViewPager和ImagerView制作可浏览可缩放图片
- Android 实现纵向浏览的ViewPager
- Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能
- Android使用ViewPager、PhotoView实现类似QQ空间图片浏览功能
- Android 使用ViewPager实现图片左右滑动和PhotoView浏览大图
- android解决图片内存溢出问题
- 利用RecyclerView实现仿陌陌滑动浏览图片
- Android利用ViewPager实现Tab
- android stutio 使用viewpager创建一个滑动图片浏览app
- 利用ViewPager实现图片循环滚动
- 利用ViewPager实现图片循环滚动
- 1499: [NOI2005]瑰丽华尔兹
- CentOS 安装Python3 及 Pip3
- Bootstrap3.0学习第五轮(表格)
- mysql日常操作语句
- Qt多线程的用法
- Android利用ViewPager实现图片浏览,解决内存问题
- Unity3D 阴影和深度纹理总结
- Bootstrap3.0学习第六轮(表单)
- [js]02css基础-清除浮动
- Bootstrap3.0学习第七轮(按钮)
- linux查看启动和运行时间
- 20非常有用的JAVA程序片段
- PHP7.0微信公众平台开发3: API接口的调用代码模板
- 每日积累(二零)--多用户同时操作同一数据