图片加载oom以及photoView缩放崩溃问题
查看大图这种需求在很多地方都用的到,而且产品说了,要可以缩放,要可以滑动哦。
然后就轮到技术人员来实现了。
首先,viewpager是必备的,其次放大图片photoView,然后就是嵌套来编写了。
class ImagePagerAdapter extends PagerAdapter {@Override public int getCount() {return imageList.size();}@Override public View instantiateItem(ViewGroup container, int position) {PhotoView photoView = new PhotoView(container.getContext());imageLoader.displayImage(imageList.get(position), photoView, options);// Now just add PhotoView to ViewPager and return it container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);return photoView;}@Override public void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);} @Override public boolean isViewFromObject(View view, Object object) {return view == object;} }
这样就可以完成了一个滑动的查看大图的功能,很简单,但是还是有坑的。
问题以及解决方案:
一、关于图片缩放的photoView第三方
使用方法:
compile 'com.github.chrisbanes:PhotoView:1.3.0'
但是官方给出一个坑,会出现一个缩放的坑,异常是类型转换。
java.lang.IllegalArgumentException: pointerIndex out of range
其实原因就是缩放太小,超出范围了,解决方法就是重写ViewPager的onInterceptTouchEvent事件就OK了
/** * Author:Shaojian * DATA:16/6/8. * ACTION:防止图片缩放时候产生的异常 * TYPE:重写ViewPager */ public class SlideViewPager extends ViewPager {public SlideViewPager(Context context) { super(context);}public SlideViewPager(Context context, AttributeSet attrs) { super(context, attrs);}@Override public boolean onInterceptTouchEvent(MotionEvent ev) {try {return super.onInterceptTouchEvent(ev);} catch (IllegalArgumentException e) {e.printStackTrace();return false;}} }
这个问题是说想要使用一个已经释放的图片资源,说白了,你每页加载使用的都是common_loading这张图片,
但是你在滑到第三张时候已经释放了该资源,所以会造成该异常。
解决很简单,就是如下这样就ok了,至于想要加载图片或者其他的方法,后续继续更新。
options = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).considerExifParams(true).build();
如果您有其他的坑,也请分享给我吧,jsmeli@163.com
二、图片过大,手机内存过小会产生oom异常
解决方案1:可以在Androidmanifest里Application添加一个属性
这样可以给App申请出更多的内存来,但是这样也是治标不治本。
class ImagePagerAdapter extends PagerAdapter {@Override public int getCount() {return imageList.size();}@Override public View instantiateItem(ViewGroup container, int position) {PhotoView photoView = new PhotoView(container.getContext());imageLoader.displayImage(imageList.get(position), photoView, options);// Now just add PhotoView to ViewPager and return it container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);return photoView;}@Override public void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object); if (object instanceof PhotoView) {PhotoView s = (PhotoView)object;BitmapDrawable bitmapDrawable = (BitmapDrawable) s.getDrawable();if (bitmapDrawable != null) {Bitmap bm = bitmapDrawable.getBitmap();if (bm!=null && !bm.isRecycled()) {s.setImageResource(0);bm.recycle();}}}}@Override public boolean isViewFromObject(View view, Object object) {return view == object;} }
其实就是释放不用的图片资源。
ps:释放图片资源会产生一个bug(设置默认加载图片时候)
这样还会产生一个问题,就是如果是使用imageLoader加载图片的,会设置一个option,
options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.common_loading).showImageForEmptyUri(R.drawable.common_loading).showImageOnFail(R.drawable.common_loading).cacheInMemory(true).cacheOnDisk(true).considerExifParams(true).build();
加入你这时候没网或者其他的问题,造成图片记载不出来,就会产生这样的一个问题
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@17947547
解决方案2:就是释放出不用的图片资源。
android:largeHeap="true"
说白了,就是内存溢出了,图片加载张数过多或者单张图片过大都会造成这个问题的发生。
图片加载oom以及photoView缩放崩溃问题相关推荐
- 图片加载优化,拒绝OOM
2019独角兽企业重金招聘Python工程师标准>>> 最近做了个资讯类的app项目,涉及到大量的图片加载,因公司项目框架已经集成了Glide用于加载图片,理所当然就直接用了Glid ...
- jquery图片预加载+自动等比例缩放插件
/* **************图片预加载插件****************** ///作者:没剑(2008-06-23) ///http://regedit.cnblogs.com ///说明: ...
- Android踩坑日记:使用Fesco图片加载库在GridView上的卡顿优化
1,fresco是一个强大的图片加载库 2,fresco设计了一个叫做image pipeline(图片管道)的模块,它负责从从网络,从本地文件系统,从本地资源加载图片,为了最大限度节约资源和cpu时 ...
- Fresco图片加载框架的介绍,相关开源库以及工具类的封装
Fresco图片加载框架的介绍,相关开源库以及工具类的封装 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 简介 Fresco 是Facebook开源的安卓上的 ...
- 图片加载之Glide使用
一.简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫Glide的图片加载库,作者是bumptech.这个库被广泛的运用在Google的开源项目中,包括2014年Google I/O大会上发 ...
- Fresco图片加载框架使用方法完全指南
简介 Fresco 是Facebook开源的安卓上的图片加载框架,也可以说是至今为止安卓上最强大的图片加载框架. 相对于其他几个图片加载框架,Fresco主要的优点在于更好的内存管理和更强大的功能,更 ...
- Android图片加载优化
一.高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大 ...
- Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]
前半部分找不到原文链接了 后半部分原文链接:http://www.jianshu.com/p/5364957dcf49 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者" ...
- Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载...
在使用这个框架的时候,我们必须要配置一个DisplayImageOptions对象来作为ImageLoader.getInstance().displayImage()中的参数,所以很有必要讲解这个对 ...
- 图片加载框架之Fresco
Fresco图片框架简介及使用 Fresco是FaceBook退出了一个Android开源图片管理框架,它提供了图片下载.渐进式加载.内存管理等功能,很大程度上把程序员从繁琐的图片管理工作中解放了出来 ...
最新文章
- DependentLayout相对布局
- 核心概念——节点/边/Combo——内置节点——Diamond
- UltraEdit 常用快捷方式
- CVPR2005【行人检测】HOG+SVM用于人体检测的梯度方向直方图
- android官方素材,android Studio 中文社区
- python绘制玫瑰花代码视频_python turtle玫瑰花绘制效果和源代码
- jogamp-env.xml:48: Unsupported Java version: 11. Make sure that the version of the Java compiler is
- Java IO 创建文件解决文件名重复问题
- android 蒙版图片带拖动_「ps|pr」大概ps的剪切蒙版和pr的轨道遮罩键是兄弟吧
- js去空格的其他方法
- sonarlint 安装
- Java自学资料!你确定你真的理解_双亲委派_了吗?!
- 福禄克光纤OTDR测试与光损耗测试的区别分析
- vue axios中文文档详解
- beetle-j2ee-application-framework框架介绍.md
- Java修改文件夹名称
- 微博三方登陆-02.微博开放平台注册及使用
- windows系统部署docker文档
- 2021-2027全球与中国射频发生器市场现状及未来发展趋势
- 解决Ubuntu 键盘输入一直大写的问题