ViewPager的内存问题

时间:2012-01-12 08:57:30

标签: java android memory android-viewpager

我目前正在开发一个使用ViewPager的应用程序,问题是我这样做的方式使得启动速度极慢并占用了大量的内存。

我正在实现这样的pageradapter:

        public MyPagerAdapter(Context context) {
        views = new ArrayList<RelativeLayout>();
        views.add(new SliderLayout(context, "slide 8"));
        views.add(new SliderLayout(context, "slide 1"));
        views.add(new SliderLayout(context, "slide 2"));
        views.add(new SliderLayout(context, "slide 3"));
        views.add(new SliderLayout(context, "slide 4"));
        views.add(new SliderLayout(context, "slide 5"));
        views.add(new SliderLayout(context, "slide 6"));
        views.add(new SliderLayout(context, "slide 7"));
        views.add(new SliderLayout(context, "slide 8"));
        views.add(new SliderLayout(context, "Slide 1"));
    }

所有layoutobjects都包含一个带有textView的FrameLayout和一个包含带有本地html的webview的panel。所有布局都有唯一的内容,在实例化SliderLayout类时会加载和膨胀。

我还尝试在instantiateItem方法中动态添加视图,但这只会使滚动变得更加狡猾,并且如果我滚动得太快会给出OutOfMemory致命异常。

所以我的问题是,实现包含几个独特视图(但基于相同布局)的ViewPager的最佳方法是什么,所以它不会占用太多内存并且启动速度更快?

2 个答案:

答案 0 :(得分:2)

您必须将您的视图附加到instantiateItem()中的寻呼机(就像您在常规适配器的getView()方法中那样)。在这种情况下,ViewPager会关注内存管理。在CompatibilityPackage中查看演示项目。实际上,你可以有数千页没有任何滞后。

@Override
public Object instantiateItem(View collection, int position) {
    View v = layoutInflater.inflate(...);
    ...
    ((ViewPager) collection).addView(v,0);
    return tv;
}

@Override
public void destroyItem(View collection, int position, Object view) {
    ((ViewPager) collection).removeView((TextView) view);
}

答案 1 :(得分:0)

嗯,我的想法是在ViewPager中捕获事件“onPageChanged()”并设置 页面更改后的webview - 或者,例如预加载页面,以便您拥有 “滚动效果”:您执行以下操作:

例如,您有10页的计数。如果您的viewpager位于第0页,那么您将实例化并加载页面0,1,2。如果您的viewpager在屏幕4,则删除webview 位置0,1和7,8,9 ...

以这种方式你不需要webviews的所有实例(webkit消耗大量内存) 并有更多的记忆。