0

これはSOで最もよく聞かれる質問の1つであるに違いないことは知っていますが、他のどの回答も私に解決策を与えませんでした。しかし、他の回答を読むと、アプリの動作方法を再設計する必要があるようです。

このように、いくつかのビューを膨らませるScrollViewがあります。ListViewをこの状況で使用することはできません。これは、ListViewを希望どおりに動作させるには、ListViewを拡張する必要があるためです。これは、実行したくないことです(これが、現在の方法に対する唯一の解決策のようですが)このOOM例外のため、アイテムを表示します)。リストには1行あたり多くの列を含めることができ、画面が大きいほど、より多くの列が含まれます。

膨らんだ各ビューには、画像を含むデータベースからの情報を表示するレイアウトがあります。この画像はバイト配列を介して保存されます。デバイスカメラで撮影した写真です。現在、すべての写真(バイト配列)は800kbから1mbを使用していますが、これは私には多くのように思えます。現在、リストには30以上のアイテムがあります。OOMが起こるまで写真を撮りましたが、全部で6枚(たまに7枚)撮ったときに撮ったんです。これは8MBから9MBのデータになります。他のアクティビティに移動し、ScrollViewが含まれているアクティビティに戻るたびに、リストを再入力する必要があります。

これは、PopulateListメソッドのスニペットです。

if (item.getImg() != null) {

            if (App.debug) {

                Log.d(TAG, "Setting bmp.");
            }

            Bitmap bmp = App.byteArrayToBmp(item.getImg());

            imgV.setImageBitmap(bmp);
        }

膨らんだビューはすべて、他の情報を含む「詳細ダイアログ」を開きます。おそらく、画像が代わりにリストに表示される可能性があります(つまり、すべての膨張したビューが同じ高度なダイアログを共有するため、ビットマップは1つだけになります)。または、ListViewを拡張して、リサイクル方法の恩恵を受けることもできます(6つ以上のアイテムが画面に表示される可能性があると考えているので、これは良い解決策ではありません)。私を悩ませているもう一つのことは、800kbのすべての写真です。128x128の場合は多くのようです。

サイズの設定は次のとおりです。

cameraParams.setPictureSize(App.pxToDpi(128), App.pxToDpi(128));
cameraParams.setPictureFormat(PixelFormat.JPEG);

camera.setParameters(cameraParams);

public static int pxToDpi(int px) {

    final int scale = app.getApplicationContext().getResources().getDisplayMetrics().densityDpi;

    int pixels = (int) px * (scale / 160);

    return pixels;
}

それで、私のアプリの現在のモデルを維持するという私の問題に対する解決策があると思いますか、それとも私は再定式化する必要がありますか?

編集:ビットマップメソッド:

public static Bitmap byteArrayToBmp(byte[] byteArray) {

    Bitmap img = null;

    BitmapFactory.Options opts = new BitmapFactory.Options();

    opts.inSampleSize = 2;

    img = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length, opts);

    return img;
}
4

1 に答える 1

2

公式のAndroidトレーニングドキュメントをご覧になることをお勧めします。更新されたばかりです。

レッスンでビットマップを効率的に表示するを確認してください:これを超える大きなビットマップを効率的にロードする。

基本的に、sampleSizeを使用して画像をデコードし、必要な幅と高さにデコードできます。

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        } else {
            inSampleSize = Math.round((float)width / (float)reqWidth);
        }
    }
    return inSampleSize;
}

上記のリンクで非常に詳細に説明されています

于 2012-06-14T21:29:21.450 に答える