ViewPager加载多张图片出现内存溢出的解决办法

最近做一个类似图片游览器的功能,用ImageSwitch倒是可以,只要设置in 和 out 的动画就能做出类似左右滑动的效果,但是却没有ViewPager那种切换图片的效果好,而且用TouchListener监听左右滑动又不是很灵敏,所以选择ViewPager来实现左右滑动切换图片的效果.但是开始做的时候用平常的写法会出现内存溢出的情况,所以做了一些优化.

主要是用到了BitmapFactory压缩图片和没有用的图片进行回收.试过了切换100张图片也不会出现内存溢出的状况.

第一步:在xml中定义VIewPager

<android.support.v4.view.ViewPager
        android:id="@+id/picture_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

第二步:在代码中设置适配器

mPicture_vp = (ViewPager) view.findViewById(R.id.picture_vp);

List<View> list=new ArrayList<View>();

list.add(getActivity().getLayoutInflater().inflate(R.layout.picture_item1,null));

list.add(getActivity().getLayoutInflater().inflate(R.layout.picture_item2,null));

list.add(getActivity().getLayoutInflater().inflate(R.layout.picture_item3,null));

mPicture_vp .setAdapter(new PictureAdapter(list,getActivity()));

第三步:定义适配器,继承PagerAdapter

public class PictureAdapter extends PagerAdapter{


private List<View> mlist;
private Context c;

public PictureAdapter(List<View> v,Context context) {
mlist=v;
this.c=context;
}

@Override
public int getCount() {
if (mlist==null) {
return 0;
}
return mlist.size();
}


@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}

@SuppressLint("NewApi")
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
BitmapDrawable gatLayoutbd=(BitmapDrawable)((ImageView)mlist.get(position).findViewById(R.id.picture_image)).getBackground();
((ImageView)mlist.get(position).findViewById(R.id.picture_image)).setBackground(null);//设置成null使之前的背景图片可以回收,释放内存

if (gatLayoutbd!=null && gatLayoutbd instanceof BitmapDrawable) {
if (gatLayoutbd.getBitmap()!=null && !gatLayoutbd.getBitmap().isRecycled()) {
gatLayoutbd.getBitmap().recycle();//回收图片,释放内存
}
}
container.removeView(mlist.get(position));


}

       @Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView iv=(ImageView) mlist.get(position).findViewById(R.id.picture_image);
BitmapFactory.Options opts=new BitmapFactory.Options();//图片工厂 
opts.inSampleSize=2;//优化图片 使显示图片的大小为原图的一半,但是清晰度也会按比例下降

switch (position) {
case 0:
iv.setBackground(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(),R.drawable.pic1, opts)));
break;
case 1:
iv.setBackground(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(),R.drawable.pic2, opts)));
break;
case 2:
iv.setBackground(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(),R.drawable.pic3, opts)));
break;

                    }

                container.addView(mlist.get(position));
return mlist.get(position);

}


}

在测试时发现 在Android原生系统上是没有问题的,但在华为EMUI系统上还会出现内存溢出的情况,大牛们如果知道望告知.


2016、10、20

问题解决了 用了imageload后在华为系统也能正常运行 而且可以不用压缩图片(压缩图片会降低清晰度)

在网上下载universal-image-loader-1.9.4-with-sources.jar 

this.mImageLoader = ImageLoader.getInstance(); 初始化

mImageLoader.displayImage("drawable://" + list_imageid.get(position), iv);这句加在上面代码opts.inSampleSize=2;后面就可以了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值