5

それぞれが画像とテキストで構成される 5 つのスライドを使用して、Android で ViewPager を作成する必要があります。画像のリソースを含む配列があります。

  private static final int[] images = {R.drawable.tutorial_step_01, R.drawable.tutorial_step_02, R.drawable.tutorial_step_03, R.drawable.tutorial_step_04, R.drawable.tutorial_step_05, R.drawable.tutorial_step_06};

次に、アダプターを作成します。

@Override
    public Object instantiateItem(ViewGroup container, int position) {

        LinearLayout tv = (LinearLayout) inflater.inflate(R.layout.tut_slide, null);
        TextView title = (TextView) tv.findViewById(R.id.tut_title);
        title.setText(getResources().getText(titles[position]));
        TextView content = (TextView) tv.findViewById(R.id.tut_content);
        ImageView image = (ImageView) tv.findViewById(R.id.tut_image);

        slide_image = BitmapFactory.decodeResource(getResources(), images[position]);
        image.setImageBitmap(slide_image);
        content.setText(getResources().getText(contents[position]));
        ((ViewPager) container).addView(tv, 0);
        return tv;
    }



    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((LinearLayout) object);

//
}

問題は、別のページを選択した後、アンドロイドが画像を収集したくないという事実です。そのため、10 ~ 15 回の変更の後、OutOfMemory 例外が発生します。次に、初期化行に追加しました

if (slide_image!= null) {
            slide_image.recycle();
            System.gc();
        }

そして、それは良い仕事です!ただし、1 つ例外があります。最初の画像の代わりに黒い画面があり、数回フリップすると実際の画像に置き換えられます。だから私はそのようなメモリリークをどうするかわかりません

4

4 に答える 4

6

さて、私はついに問題を解決しました。私は非常によく似たケースに直面しましたが、同じ問題に関連する質問が非常に多く見られたため、まだ回答が得られていないため、この質問を選択しました。を超えたときだけでなく、画面の回転が発生したときにもメソッドをPagerAdapter呼び出す必要がありますが、そうではないため、強制的に実行する必要があります...それを実現するには、アダプターを null に設定するだけですアクティビティのorメソッドについて。destroyItemoffLimitScreenPageLimitonStoponDestroy

@Override protected void onDestroy(){
    pager.setAdapter(null);
}

乾杯!

于 2015-05-05T00:54:27.360 に答える
0

その動作は、メモリ リークとは関係ありません。ビューページャーの更新ライフサイクル内でビットマップをいつ、どのようにリサイクルするかに関連しているようです。初期化のある時点で onPageSelected() または notifyDatasetChanged() を手動で呼び出してみてください。

この解決策は問題を完全に解決しないかもしれませんが、試してみてください。あなたの説明ではわかりにくいです。

于 2012-11-13T17:31:45.027 に答える
0

私の場合、ViewPager に 31 ページあります。私はこれを使用します:

 @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

        if(dbCon!=null)
            dbCon.close();

        ViewPager viewPager = (ViewPager)container;
        View view = (View) object;
        viewPager.removeView(view);
    }

そしてすべてがうまくいきます。アルハムドゥリラ。

于 2020-11-13T11:18:01.973 に答える