ViewPager setCurrentItem 导致UI线程冻结

8
我正在使用来自Android支持v13的ViewPager,并希望使用setCurrentItem(int)滚动到特定项,但是当我尝试滚动超过2页时,应用程序会冻结,几秒钟后系统显示ANR窗口。
我尝试使用setOffscreenPageLimit(2)增加屏幕外页面限制,这样当我尝试滚动2页时它不会冻结,但是尝试滚动3页时也会出现相同的问题。
我的问题是我的片段占用了很多内存,因此我不想在内存中存储太多内容。我使用了与支持库v4相同的代码,但我必须将其更新为v13才能使用NotificationCompat.Builder.addAction(int, CharSequence, PendingIntent)
你们中有人知道可能是什么问题,以及可能的解决方案吗?

1
你可能在适配器中做了太多的工作。请发布相关代码。 - laalto
你可以使用DDMS方法分析器查找当前发生了什么:http://stackoverflow.com/questions/3636746/question-on-ddms-method-profiler - zapl
3个回答

22

您的适配器是否处理大量项目?(非常大的>〜220项)

ViewPager.populate(int)将从当前项目位置循环到N,这是适配器中项目的数量 - 因此,如果您将其设置为较大的值(例如Integer.MAX_VALUE),则需要一些时间,但最终将完成。

如果这是您的情况,请搜索“无尽的pager”相关问题,如Endless ViewPager android,或将项目数量限制为对于主线程合理的数量。


这是一个日历,所以它包含大量的碎片。我会查看你的解决方案,谢谢。 - pshegger
我的列表只有15个项目,当我将当前位置从3更改为10(从3到10)时,应用程序无响应,但是如果我从0更改为1、从3更改为4等,则可以正常工作。另外,我使用的是https://github.com/daimajia/AndroidImageSlider,其中包括“InfinitePagerAdapter”类。 - user924

1

我遇到了相同的问题。我使用PagerAdapter实现了无限滚动。

public static final int INITIAL_OFFSET = 1000;
@Override
    public int getCount() {
        return Integer.MAX_VALUE / 2;
}

并以以下方式启动 ViewPager
viewPager.setCurrentItem(INITIAL_OFFSET);

所以为了消除冻结,我编写了一个小函数:
private void movePagerToPosition(int position) {
        int current = viewPager.getCurrentItem();
        int sign = current > position ? -1: 1;
        while (viewPager.getCurrentItem() != position){
            viewPager.setCurrentItem(viewPager.getCurrentItem() + sign, true);
        }
 }

0

我有这个问题。 在自定义的viewPager中添加以下方法并使用它。

private void setupCurrentItem(int cur)
    {
        try
        {
            Class<?> viewpager = ViewPager.class;
            Field mCurItemField = viewpager.getDeclaredField("mCurItem");
            mCurItemField.setAccessible(true);
            mCurItemField.set(this, cur);
        }
        catch (Exception ignored) {}
    }


setupCurrentItem(100);
setCurrentItem(100, false);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接