2

私のアクティビティにはリストビューがあり、(他のすべてのものを除いて)Webから画像をロードし、リストビューに表示します。私は5つのAndroidデバイスにアクセスできます:2つのHTC Desire、LG P-350、もう1つの電話とタブレット。通常、すべてが正常に動作しますが、HTCの要望のいずれかで起動すると、アプリはNullPointerExceptionでクラッシュする傾向があります。これは、メモリ不足エラーが原因です(おそらくそうです)。これは次の出力です。

05-03 14:41:23.818: E/dalvikvm(843): Out of memory: Heap Size=7367KB, Allocated=4991KB, Bitmap Size=16979KB

後で、logcatはnullpointerexceptionのスタックトレースを出力します。静的変数の1つが突然nullになります(変数はアプリのルートアクティビティで初期化され、アプリ全体で使用され、コードでnullになりません)。おそらく、メモリ不足のためにシステムによって無効にされていると思います。私が理解している限り、システムは17mbもの大きさのビットマップを割り当てようとします-ロードされた画像はそれほど大きくはないと確信しています。それらは100*70 jpegであり、いずれも1MBよりはるかに軽量です。私が理解していないもう1つのことは、このエラーが1つのデバイスでのみ発生する理由です。他のデバイスは正常に動作します。

私の考えでは、これは非常に奇妙に見え、手がかりが見つからないので、アドバイスが必要です。

4

1 に答える 1

2

理由は簡単です: メモリは JPG データを保持しているのではなく、圧縮解除された同等のデータを保持しているため、言うまでもなく、ソース ファイルよりも多くの RAM スペースを必要とします...この 17 MB の制限はすべてのロードされたビットマップを一度に、必ずしも単一のものとは限りません。

私のプログラムの 1 つ (Mapquest Android API MapView オブジェクトのカスタム Tile ローダー) で同様の問題に対処しなければならず、recycle()可能な限りビットマップのメソッドを呼び出す必要があり、手動でシステムをガベージする必要がありました。System.gc()...を使用して戦略的な場所で収集します

最高のニュースの担い手でなくてごめんなさい...

私が行ったのと同じ戦略を使用して問題を解決できるかもしれません。私は基本的に、ロードされたビットマップを外付け SD カードなどのハード ストレージにキャッシュし、すべてを RAM に保持しようとするのではなく、必要に応じてオンザフライで再ロードします。

于 2012-05-03T11:28:36.273 に答える