uRLから画像をダウンロードして表示しています。ダウンロード時には、_out of memory error : bitmap size exceeds VM budget
_が与えられます。ドロアブルを使用しています。コードは次のとおりです。
_HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap = Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();
_
エラーは次のとおりです。05-28 14:55:47.251: ERROR/AndroidRuntime(4188): Java.lang.OutOfMemoryError: bitmap size exceeds VM budget
decodeStream(is, outPadding, opts)
を使用する
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024];
画像サイズを確認してから、適切な係数でダウンサンプリングできます。
この質問を参照してください: Handling large Bitmaps
この問題は数回報告されているようです here および here forインスタンス...申し訳ありませんが、シャリーニですが、それが同じ問題である場合、まったく解決策がないようです...
Romain Guyの唯一のアドバイスは、 より少ないメモリを使用することです...
だから、あなたのものを違うように考える幸運...
最後に、上記のようにイメージをリサンプリングした後、 bitmap_file.recycle() を呼び出すことができます。
私はこれがうまくいくものである多くのことを試しました。
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true;
opts.inScale=8;
///after you use your images
System.gc();
事実は、いくつかのAndroidバージョン、特にバージョン2.1がこのような問題で常に失敗するというバグがあります。
リソースの使用に細心の注意を払ったアプリをリリースしました。使用していた多くのビットマップも削除しましたが、現在はグラフィックプリミティブを使用してオンザフライで作成されています。また、ビットマップを使用しないときはリサイクルします。そしてもちろん、私はアプリにメモリリークがないことを確認しました。使用されたメモリは制御なしに増大することはなく、常に適切な値内に維持されます。
私はこの問題を回避するために多大な労力を費やしましたが、2.1および2.1-update1デバイスからのような多くの迷惑な例外が引き続き発生します。私は今、クラッシュを報告するためにcritercismを使用していますが、アプリがたった4メガバイトのRAMを使用している場合でも、すべてのAndroid deviceアプリに必要なものであり、事実、最近のデバイスのほとんどは16Mを超えるヒープサイズを持っています。
すべてのビットマップのサイズは800x480ピクセルです。最悪の場合、ARGB_8888は各1.5MBを超えることはありませんが、4 MBしか占有していない場合にロードしようとするとクラッシュするため、少なくとも12 MB必要です。無料です。そして、私のビットマップのほとんどは、メモリの半分を占有するARGB_4444としてロードされます。ビットマップが4444で非常に貧弱に見える場合にのみARGB_8888を使用します。
したがって、これらのAndroidバージョンでは正常に動作していないバージョンがあります。このクラッシュの99'9%は2.1および2.1-updateからのものであり、残りは他の時間厳守の理由で説明されています。