在使用UltraViewPager一段时间后总感觉app持续运行一段时间后会慢慢变得卡顿,今天在用Profiler观察内存时发现UltraViewPager每次翻页内存都会增加。
追踪到到库里面UltraViewPagerAdapter的destroyItem方法时,发现有以下问题。
我是这样理解,在调用setMultiScreen后,UltraViewPagerAdapter在instantiateItem时会给我们的item外层包装一层relativeLayout,而在destroyItem时只是将包装的relativeLayout内部的所有view给remove掉,并没有将包装的relativeLayout从viewPager中remove掉,导致viewPager中的view持续增加。
我是在使用viewPager.setPageTransformer时发现的这个问题,setPageTransformer后为viewPager的每个child都添加了动画,由于上面所说的relativeLayout都还存在于viewPager,所以这时会为多个child执行动画,导致内存占用很大。特别是设置自动滚动后持续一段时间,表现出程序越来越卡顿。
问题代码在UltraViewPagerAdapter
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
int realPosition = position;
//TODO
if (enableLoop && adapter.getCount() != 0)
realPosition = position % adapter.getCount();
if (isEnableMultiScr() && object instanceof RelativeLayout) {
View child = ((RelativeLayout) object).getChildAt(0);
((RelativeLayout) object).removeAllViews();
//****这里需要container.remove((RelativeLayout) object)
adapter.destroyItem(container, realPosition, child);
} else {
adapter.destroyItem(container, realPosition, object);
}
viewArray.remove(realPosition);
}
解决方案:
这里解决方案为临时方案,根本原因是由于库里面包装的UltraViewPagerAdapter未删除已经划出页面的relativeLayout,这里我们在自定义的adapter中需要删除这些relativeLyaout。代码如下:
CustomPagerAdapter
@Override public void destroyItem(ViewGroup container, int position, Object object) { //这里为常规删除viewPager中的view,但是库未将包装的relativeLayout返回,所以这里不能成功删除 //View view = (View) object; //container.removeView(view); //我们需要直接从ViewPager中删除未在页面上显示的view View child = container.getChildAt(0); Rect rect = new Rect(); boolean visibility = child.getGlobalVisibleRect(rect); if (!visibility) { container.removeView(child); } }