关于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小时的不间断测试,内存一直稳定。 }