实例化ViewPager的所有片段只有一次有多糟糕?

时间:2014-03-14 09:33:14

标签: android

我在MainActivity中使用ViewPager,其中包含少量且固定数量的视图(仅3或4个)。如果我遵循实现ViewPager的传统方式,我必须这样做:

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new MyFragment0();
        case 1:
            return new MyFragment1();
        case 2:
            return new MyFragment2();
    }
    return null;
}

在这种方法中,通常只实例化第一和第二个片段,并且一旦用户滑动到第二个或第三个标签,第三个片段就被实例化,并且第一个片段可能被破坏。优点很明显:Android只保留用户直接与之交互的内存片段。在我的大多数应用程序中,我都这样做,一切正常,但现在我正在开发一个需要这些片段相互交互的应用程序。例如,当用户单击第三个片段上的按钮时,必须在第一个片段上触发某个功能。当在第二个片段中输入相同的数据时,必须在第三个片段上执行另一个函数,依此类推......我的问题是所有的片段都没有被实例化,所以它真的很痛苦检查它们是否存在,并确保在实例化相关片段后(当用户滑动它们时)将调用正确的函数。

我的问题是:将三个(四个)片段实例化一次并将所有这些片段保留在内存中会有多糟糕,所以我可以保证它们一直都是实例化的:

MyFragment0 myFragment0 = new MyFragment0();
MyFragment1 myFragment1 = new MyFragment1();
MyFragment2 myFragment2 = new MyFragment2();

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return myFragment0;
        case 1:
            return myFragment1;
        case 2:
            return myFragment2;
    }
    return null;
}

1 个答案:

答案 0 :(得分:0)

根据片段的复杂程度,它一点都不差,但是我使用ViewPager的原生偏移来实现它:

mViewPager.setOffscreenPageLimit(4);

这会导致ViewPager 在空闲状态下设置应保留到视图层次结构中当前页面任一侧的页面数。因此它会将它们保留在内存中。

试验并查看它是否有效。在任何情况下,将片段保存在记忆中并不坏,只要确保您不会一直重新安装它们,除非需要它。

监控您的内存使用情况,并控制它是否适合您。

当然,如果你在每个片段上实例化一个20mb的位图......那你就去了OOM的应用程序。

另一方面,设计您的应用,以便破坏您的碎片 。它可能发生,并且它不受你的完全控制。 (除非你泄漏内存)。最后,让Android完成它的工作。 ;)