2012-01-12 8 views
1

私は現在、ViewPagerを使用するアプリケーションを開発しています。問題は、私がやっている方法が起動が非常に遅くなり、メモリを大量に消費することです。私はそうのようなpageradapterを実装していますViewPagerのメモリの問題

 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は、ローカルHTMLでのWebViewを含んでのTextViewとpanelとでframeLayoutが含まれています。すべてのレイアウトには、SliderLayoutクラスがインスタンス化されたときにロードされ、膨張されるユニークなコンテンツがあります。

また、instantiateItemメソッドでその場でビューを追加しようとしましたが、スクロールがもっと厄介になり、あまりにも速くスクロールするとOutOfMemoryの致命的な例外が発生します。

私の質問は、いくつかのユニークなビュー(同じレイアウトに基づいています)を含むViewPagerを実装する最良の方法は何ですか、それはあまりにも多くのメモリを消費せず、より速く開始しますか?

答えて

2

通常のアダプタのgetView()メソッドと同様に、instantiateItem()のページャにビューをアタッチする必要があります。この場合、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

ありがとう、デモプロジェクトはあなたを指していますか?私は私の元の質問で私を助ける特定の何かを見つけることができないようです。 –

+0

Support4DemosフォルダのFragmentPagerSupport.javaを見てください。フラグメントがあるViewPagerがありますが、FragmetPagerAdapterの代わりにPagerAdapterを使用し、getItem(int position)メソッドをpublic Object instantiateItem(ViewGroup container、int pos)メソッドに置き換えることができます(これは通常のListViewのアダプタで行います)。申し訳ありませんが、私の悪い、私はあなたが早くメソッド名を間違って取得します。 – deviant

0

HM、私の考えが変わりましたViewPagerで「onPageChanged()」イベントをキャッチし、ページの後 のWebViewを設定することです - または、あなたが 「スクロール効果」を持っているので、一例として、ページをプリロードします:次のようにします。

例として、10ページのカウントがあります。ビューページがページ0にある場合は、ページ0,1,2をインスタンス化して読み込みます。あなたのビューページが画面4にある場合、0,1と7,8,9 ...の位置でwebviews を削除します。

このようにして、webviewsのすべてのインスタンスを必要としません(Webkitは大量のメモリを消費します) といくつかのメモリがあります。

+0

私は(それはそれだわからないんだけど、私はすべてのwebviews .. –

+0

ViewPager myViewPager =無効にした場合、それはまだ多くのメモリを使用するため、「...ここインスタンスを見つける...」 myViewPager.removeViewをmyWebkitView); このようにして、WebkitインスタンスがViewPagerオブジェクトのpagetreeに存在しないことを確認します。 – Andreas

+0

ありがとうございますが、私はすべてのレイアウトからすべてのwebviewを削除しようとしましたが、それと同じ量のメモリを使用しています。私はそれがすべてのレイアウトが同じ時間に、またはその程度まで膨らんでいるということを推測しています。 –