关于ViewPager设置属性页setCurrentItem会阻塞主线程ANR总结

来源:互联网 发布:华为数据库一体机 编辑:程序博客网 时间:2024/06/07 13:37

关于android开发设置View Pager的直接跳转页set CurrentItem会阻塞主线程ANR。

根据网上解决的说法,分析源码:

if (mFirstLayout) {    // We don't have any idea how big we are yet and shouldn't have any pages either.    // Just set things up and let the pending layout handle things.    mCurItem = item;    if (dispatchSelected) {        dispatchOnPageSelected(item);    }    requestLayout();} else {    populate(item);    scrollToItem(item, smoothScroll, velocity, dispatchSelected);}
是因为主线程测量滑动距离,绘制UI阻塞,因此通过反射拿到 mFirstLayout变量,每次在setCurrentItem的代码之前设置为true,


try {

Field mFirstLayout = ViewPager.class
.getDeclaredField("mFirstLayout");
mFirstLayout.setAccessible(true);
mFirstLayout.set(vpImg, true);
vpImg.setCurrentItem(num + numCenter, false);
} catch (Exception e) {
e.printStackTrace();

}

根据以上解决方法本应能够解决ANR,可事实依然存在问题,上码:

@Override
public int getCount() {
tvPicSum.setText(vpImg.getCurrentItem() % mOrderListPic.size() +
1 + "/"
+ mOrderListPic.size());
if (mOrderListPic.size() >= 2) {// 当条目超过一个
return Integer.MAX_VALUE;
}
return mOrderListPic.size();
}

这是我的适配器PagerAdapter的getCount()方法,为了能够实现ViewPager的近似无限轮播效果,我们将viewPager的限制页数设置为Integer类型的最大值,但也从而会使ViewPager在setCurrentItem时测量页数太大,绘制UI频繁而阻塞主线程ANR,因此我将数量改成了相对较小些mOrderListPic.size()*40。问题便得带了根本的解决。

1 0
原创粉丝点击