0

建物の間取り図を表示するアプリに取り組んでいます。フロア プランは、サーバーでホストされる .png ファイルです。

このコードは OutOfMemoryError を引き起こします。

InputStream is = null;
HttpGet httpGet = new HttpGet("http://server/image.png");
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(httpGet);
is = response.getEntity().getContent();

Drawable d = Drawable.createFromStream(is, null); //this line causes an OutOfMemoryException

imageView.setImageDrawable(d);

ただし、このコードは次のことを行いません。

InputStream is = assetManager.open("image.png");
Drawable d = Drawable.createFromStream(is, null);
imageView.setImageDrawable(d);

画像のサイズはかなり大きい (一例として 5100 x 3300) が、その画像はオンラインで表示すると 100 KB しかなく、.apk ファイルで見るとそれほど小さくはありません (95 KB まで)。

最初のコード スニペットでエラーが発生し、2 番目のコードではエラーが発生しない理由を知っている人はいますか? デバッグ中、最初の InputStream のサイズは 102000 バイトまでしかなく、2 番目の InputStream のサイズは 95000 バイトまでしかありません。これは、エラーを説明するのに十分な大きさの違いではないようです。

4

1 に答える 1

3

ドローアブル ストリームは、ビットマップ ドローアブルを作成します。つまり、圧縮されていない完全なビットマップをメモリに保存する必要があります。そのためには、メモリ全体 (5100*3300*4 バイト、つまり 64 MB) を割り当てる必要があります。それはAndroidには大きすぎます。

アセットから移動する場合、必要になるまでファイルを読み取らず、メモリ内ビットマップを作成していない可能性があります。ファイルポインタをメモリに保持するだけです。しかし、ストリームではそれを行うことはできません。ストリームは、読み取りに取り掛かるまでに価値がない可能性があり、(ファイルを読み取ることができる間は) 2 回以上読み取ることはできません。

于 2013-04-03T20:35:56.280 に答える