图片加载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;
        }
    }
}



二、图片过大,手机内存过小会产生oom异常
说白了,就是内存溢出了,图片加载张数过多或者单张图片过大都会造成这个问题的发生。

解决方案1:可以在Androidmanifest里Application添加一个属性
android:largeHeap="true"
这样可以给App申请出更多的内存来,但是这样也是治标不治本。

解决方案2:就是释放出不用的图片资源。
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
这个问题是说想要使用一个已经释放的图片资源,说白了,你每页加载使用的都是common_loading这张图片,
但是你在滑到第三张时候已经释放了该资源,所以会造成该异常。
解决很简单,就是如下这样就ok了,至于想要加载图片或者其他的方法,后续继续更新。
options = new DisplayImageOptions.Builder()
        .cacheInMemory(true).cacheOnDisk(true).considerExifParams(true)
        .build();



如果您有其他的坑,也请分享给我吧,jsmeli@163.com



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值