2012-01-12 65 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