阿里UltraViewPager内存问题

祝高阳
2023-12-01

在使用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);
        }
    }

 

 

 类似资料: