2012-01-12 72 views
1

我目前正在开发一个使用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网页视图一个panel。所有的布局都有独特的内容,当SliderLayout类被实例化时,这些内容被加载和膨胀。

我也尝试在instantiateItem方法中实时添加视图,但这会使滚动更加狡猾,并且如果滚动速度太快,会导致OutOfMemory致命异常。

所以我的问题是,什么是最好的方式来实现一个ViewPager包含几个独特的视图(但基于相同的布局),所以它不消耗这么多的内存,并开始更快?

回答

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); 
} 
+0

谢谢,你指的是哪个演示项目?我似乎无法找到任何具体的东西,这将帮助我解决我的原始问题。 – 2012-02-07 13:24:44

+0

查看Support4Demos文件夹中的FragmentPagerSupport.java。有ViewPager与片段,但您可以使用PagerAdapter而不是FragmetPagerAdapter并将getItem(int position)方法替换为public Object instantiateItem(ViewGroup container,int pos)方法(就像您使用常规ListView的适配器执行此操作一样)。对不起,我的不好,我早点给你弄错了方法名。 – deviant 2012-02-08 14:36:19

0

HM,我的想法是赶在ViewPager事件“onPageChanged()”,并设置 的WebView后的页面发生了变化 - 或者,让你有 预加载作为示例页面中的“滚动效应”:你做以下事情:

作为例子,你有10页的计数。如果您的viewpager在页面0,那么您instanciate并加载页面0,1,2。如果您的viewpager在屏幕4上,那么您在位置0,1和7,8,9删除webviews ...

这样您就不需要webviews的所有实例(webkit消耗大量内存) 并有更多的内存。

+0

我不知道这是它,因为它仍然使用的内存很多,如果我禁用所有网页视图.. – 2012-01-12 17:28:25

+0

ViewPager myViewPager =“...在这里找到实例......” myViewPager.removeView( myWebkitView); 以这种方式确保webkit实例不在来自ViewPager对象的页树中。 – Andreas 2012-01-17 15:53:15

+0

谢谢,但我尝试从所有布局中删除所有网页浏览,并且它仍然使用几乎相同数量的内存。我猜这是因为所有的布局都在同一时间膨胀或某种程度上.. – 2012-02-08 10:02:06