3

ViewPagerを実装しましたが、メモリ不足エラーが発生しましたが、その理由がわかりません。表示する画像は約11枚あり、各画像の画像は約500 kb(ディスク上のサイズ)で、.jpg形式です。

コードは次のとおりです。

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bmw_gallery);

ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
ImagePagerAdapter adapter = new ImagePagerAdapter();
viewPager.setAdapter(adapter);
}

private class ImagePagerAdapter extends PagerAdapter {
private int[] mImages = new int[] {
    R.drawable.bmw_1series_3door_wallpaper_01,
    R.drawable.bmw_1series_3door_wallpaper_02,
    R.drawable.bmw_1series_3door_wallpaper_03,
    R.drawable.bmw_1series_3door_wallpaper_04,
    R.drawable.bmw_1series_3door_wallpaper_05,
    R.drawable.bmw_1series_3door_wallpaper_06,
    R.drawable.bmw_1series_3door_wallpaper_07,
    R.drawable.bmw_1series_3door_wallpaper_08,
    R.drawable.bmw_1series_3door_wallpaper_09,
    R.drawable.bmw_1series_3door_wallpaper_11,
    R.drawable.bmw_1series_3door_wallpaper_12
};

@Override
public int getCount() {
  return mImages.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
  return view == ((ImageView) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
  Context context = MainActivity.this;
  ImageView imageView = new ImageView(context);
  imageView.setAdjustViewBounds(true);

  imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

  imageView.setImageResource(mImages[position]);
  ((ViewPager) container).addView(imageView, 0);
  return imageView;
}


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


}



}

私は何を間違っているのですか、それとも私のコードに何が欠けていますか?

4

3 に答える 3

10

ディスク上の 500KB の JPEG 画像は、それよりも多くのヒープ スペースを占有します。

たとえば、ここに 494KB のデジタル写真があり、解像度は 1455 x 1029 です。これを Android アプリにロードすると、1455x1029x3 = 4.3MB のヒープ スペースが消費されます。似たような特徴を持つ画像が 11 枚ある場合、それらを合わせると 40MB を超える容量が消費されます。ほとんどのデバイスには、プロセスごとに 16 ~ 32MB のヒープ領域があります。

11 個のドローアブル リソース (この場合、BMW に訴えられて忘却に追い込まれる可能性のある画像) を出荷する場合は、より小さな画像が必要になります。

于 2013-02-23T18:56:55.277 に答える
4

私はここで解決策を見つけました:http://developer.android.com/training/displaying-bitmaps/index.html 私はBitmapFunプロジェクトを私の中に実装しました。このようにして、アプリケーションは非常にうまく機能し、メモリ不足エラーは発生しなくなりました。

于 2013-03-01T08:31:50.033 に答える
2

ビューページャーに高解像度の画像を表示しているときに、同じ問題が発生しました。http://developer.android.com/training/displaying-bitmaps/index.htmlにあるすべての Android ビットマップ ソリューションを検索して適用しました。次のキャッシュ機構はリンクにあります。しかし、どれも機能しません。どこにも正しい解決策はありません。

次に、問題が次のとおりであることがわかりました。ドローアブルフォルダー構造を正しく使用できませんでした。高解像度の画像を mdpi および hdpi フォルダーに保存していました。これにより、アンドロイドは画像を超サイズに拡大します。100 kb の画像は、android モニター/メモリ セクションのおかげで、メモリが 20 mb 増加していました。これらの超解像度画像を xxhdpi フォルダーに追加したところ、突然修正されました。その後、私の画像スライダーは高解像度の画像で問題なく動作します

于 2016-03-01T17:35:56.217 に答える