0

大きな画像 (png、>30Mb) を受け取り、ビットマップを作成します。そして、java.lang.OutOfMemoryError を取得します。私はそのような例外をキャッチしようとします:

try {
    Bitmap bmp = BitmapFactory.decodeStream(someStream);
} catch (OutOfMemoryError e) {
    ;
}

2.2 SDK では問題なく動作します。しかし、2.3 アプリではキャッチされない例外で失敗します。わからない、なぜ?

ありがとう!

4

4 に答える 4

6

エラーをキャッチするつもりはありません。

Javadocから:

Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。このようなエラーのほとんどは異常な状態です。ThreadDeath エラーは、「通常の」状態ですが、ほとんどのアプリケーションがキャッチしようとしないため、Error のサブクラスでもあります。

エラーが発生した場合、特に OutOfMemoryError が発生した場合、基本的には既に手遅れです。

于 2012-05-31T10:14:03.227 に答える
1

ビットマップ イメージを使用して表示する前に、サイズを変更する必要があります。ビットマップのサイズを変更する方法については、このチュートリアルをご覧ください。

または、 FileOutputStream を使用してビットマップをファイルとしてファイルシステムに保存しようとすることもできます。このようなもの。

byte[] imageData;
FileOutputStream out = new FileOutputStream(file);
out.write(imageData, 0, imageData.length);
out.flush();
out.close();

このようなビットマップをデコードし、上記のリンクで指定されているようにスケーリング/サイズ変更します。

FileInputStream inputStream = new FileInputStream(file);
BitmapFactory.decodeStream(inputStream, null, options);
于 2012-05-31T10:21:27.050 に答える
0

30MBは大きすぎます。Android 2.2 の携帯電話でビットマップを作成できたことに非常に驚いています。私のアドバイスは、はるかに小さいイメージ ファイルを使用することです。多くの携帯電話では、アプリ全体に割り当てられるメモリは 24 ~ 30 MB です。

あなたの場合、StackOverFlowError などのエラーが発生している必要があります。エラーをキャッチできず、

于 2012-05-31T10:19:06.433 に答える
0

イメージを低解像度にデコードします。Androidでは約16MBしか許可されていません。最悪の場合、この設定を増やすことを選択できます。

また、ジンジャーブレッド前の GC は、ジンジャーブレッド後の GC とは異なります。以前はフル ガベージ コレクションで世界の GC を停止していましたが、その後、GC はコンカレントになり、部分的なコレクションが可能になりました。

于 2012-05-31T10:20:18.000 に答える