Android的Viewpage内存问题解决方案,自测有效

关于viewpage显示大量图片的导致内存不断增长的问题,在网上找了诸多资料,经过总结、实践、测试,终于找到一个完美解决方案。

参考:https://blog.csdn.net/hqiong208/article/details/53908002

           https://blog.csdn.net/vanswells/article/details/77648383

上面两位大神的解决方法经过测试,都会有一些问题,导致程序崩溃。(当然有可能是我不是完全照抄,水平有限,没理解透测导致的)。

下面是我参考上述两篇资料做的解决方案:

class ViewPagerAdapter extends PagerAdapter {
    private List<ImageView> imgViews;
    private int count = 0;
    private Activity mActivity = null;
    private int imgUrlCount = 0;

    public ViewPagerAdapter(Activity thisActivity) {
        ToolUtils.log_e("ViewPagerAdapter!!!!!!!!!!!!!!!!!!!!!!!!!");
        mActivity = thisActivity;
        imgViews = new ArrayList<>();
        //这里增加为5个缓存视图,是因为测试发现,只有4个缓存视图时,在遇到重头开始播放的时候会有不释放的现象
        for (int i = 0; i < 5; i++) {
            ImageView imgView = (ImageView) mActivity.getLayoutInflater().inflate(R.layout.ad_img_view, null);
            imgView.setTag("imgview" + i);
            imgViews.add(imgView);
        }
        imgUrlCount = imageUrls.size();
        count = imgUrlCount;
    }


    // 获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量
    @Override
    public int getCount() {
        return count;
    }

    // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可。这里判断当前的View是否和对应的key关联。
    // 这里的key和instantiateItem方法的返回值一致。
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

    // PagerAdapter只缓存三张要显示的图片,如果此时滑动到第三页时,第一页就会调用该方法去销毁相应的View。
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if(object instanceof ImageView){
            //这里修改为不是按照下标取余去释放
            ImageView releaseImgView = (ImageView)object;
            releaseImgView.setImageDrawable(null);
            releaseImgView.setImageBitmap(null);
            container.removeView(releaseImgView);
        }

    }
    // 该方法是按需调用,默认情况先调用三次,将三个即将使用View页面添加到ViewGroup中,当你滑动到第二页View时,
    // ViewPager会调用一次该方法将第四个View页面添加到ViewGroup中。该方法返回值作为key和对应位置的View关联起来。
    // 用于isViewFromObject方法判断当前View和key是否关联的。
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //获取一个被释放的视图,复用
        ImageView imageView = getImgView();
        netImage(imageUrls.get(position), imageView);
        container.addView(imageView);
        return imageView;
    }

    //获取一个被销毁的视图  这个方法时获取一个被释放的视图,以便复用
    private ImageView getImgView(){
        ImageView imageView = null;
        for(int i = 0; i < imgViews.size(); i++){
            imageView = imgViews.get(i);
            if(null == imageView.getParent()){
                break;
            }
        }
        return imageView;
    }
经过超过24小时的不间断测试,内存一直稳定。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值