2011-07-16 6 views
2

Androidのオーバーレイアイテムとして、デバイスの画面と同じ高さと幅の画像をプロットしています。しかし、画像の数がアプリを超えるとOut of Memoryエラーが発生します - ビットマップはVMの予算を超えています。リサイクルしようとすると、リサイクルされたビットマップを使用しようとするキャンバスとしてエラーが発生します。私が必要とするのは、地図上にたくさんの画像をプロットする最善の方法を持つことです。画像はサーバーから送られ、画像もキャッシュする必要があります。私はLinkedHashMapでこれをやっていますが、キャッシュ可能な場合は、ドロアブルオブジェクトを格納しているので、これでも問題が発生すると思います。メモリ不足エラー - マップでビットマップを使用しているときにビットマップがAndroidでVM予算を超えていますか?

地図上に大きなビットマップをプロットする例はありますか?

答えて

0

各アプリケーションのメモリ容量は非常に限られています(しばしば16MBですが、14MBと高く、32MBと高いと思われます)。これは、各デバイスで実行されているファームウェアに固有です。アプリケーションクラスを継承して、 "LowMemory"関数へのアクセスを提供することができます。この関数は、アプリケーションがほぼすべてのメモリを使用したときに警告します。

画面のサイズには問題はありませんが、できるだけサイズを大きくしないでください(可能な限り小さくしてください)。

Eclipseのメモリの状態をチェックして、アプリケーションが使用しているメモリ量を確認することもお勧めします。

このエラーは、地図とAndroidを扱う最も厄介なエラーの一つであり、あなたがここにSO

+0

はい、関連する問題が見つかりました。私もリサイクルしようとしましたが、キャンバスがリクライニングされたビットマップを使用しようとしているので、別のエラーが報告されたので、それは私のためには機能しません。 – sunil

+0

私はリサイクルがイメージによって使用されるメモリを廃棄すると考えています。リサイクルする場合は、オーバーレイからグラフィックを削除する必要があります。いくつのオーバーレイを描画していますか?各画像(画像とバイト)の大きさはどれくらいですか?あなたのアプリは他の場所で多くのメモリを使用していますか(例えば、DOMパーサは実際にメモリを消費しますか? – Kurru

+0

画像はデバイスの画面の幅と高さに等しくなります。サイズは約5kb t0 8kbです。私はDOMパーサを使用せず、JSONレスポンスだけを解析しています。 – sunil

2

あなたはBitmapFactory.OptionsinSampleSizeプロパティを使用して検討する必要がありますに、この問題に関連する他の記事の多くを見つけるでしょうクラス。このプロパティは、ビットマップオブジェクトが作成されたときに画像を2の累乗で再スケールし、メモリを節約します。画像の解像度が画面の解像度よりも高い場合は、画像の品質を落とさずに、完全にうまくいくはずです。次のように

サーバーからダウンロードされた画像のためにこれを使用するには、それを使用することができます:

URL url = new URL(photoUrl); 
URLConnection ucon = url.openConnection(); 

Options options = new Options(); 
options.inSampleSize = 2; 

Bitmap bitmap = BitmapFactory.decodeStream(ucon.getInputStream(),null, options); 

代わりにもなるようSoftReferenceオブジェクトであなたのHashMap内の各ビットマップオブジェクトをラップすることですVMは、OOMエラーでクラッシュするのではなく、ビットマップで使用されるメモリを再利用します。欠点は、ビットマップを個人的にリロードする必要があることです。メモリを再利用するときにVMが積極的に働いていると感じます。それはかなり素早くメモリを再利用します。