2012-01-05 17 views
1

Webサービスからデータをプルダウンして、これをListViewに表示するフラグメントがあります。私は行の背景に使用できる10種類のセレクターを持っています。バックグラウンドは一度ループすると繰り返されます。Android ListView行の背景が原因でOutOfMemoryの問題が発生する

私が直面している問題は、デバイス(Galaxy Nexus!)がこれらの背景をすべて表示することができないことです。 setbackgroundResourceでバックグラウンドを設定すると、OSは常にGCを呼び出してメモリを解放し、ListViewのスクロールが極端に不安定になります。

私は代わりにDrawablesをキャッシュしようとしました。私は改善が見えますが、デバイスは最終的にどれくらいのDrawableがキャッシュされているかのOutOfMemory例外を引き起こします。どのくらいの数がキャッシュに格納されているかの例を示すために、それぞれに2つのドロウアブルを含む10個のセレクタと、最初と最後のセレクタが必要です。これはメモリ内の24個のドロウアブルです。

私は使用している画像のサイズになる可能性があると思っていましたが、それらをスケールダウンして比例して伸ばしてください。

提案がありますか?私はこのノンストップで数日間働いており、実行可能な/近い解決策を見つけていません。

おかげ

アダム

答えて

6

Mimminito、

問題は、あなたがAndroidプラットフォーム上で疫病に多くの開発者が記述しています。その理由は、GoogleがView Drawablesを実装したとき、以前のDrawableを保持する必要があるかもしれないという正当な仮定をしなければならなかったからです。これは、ますます多くのプラットフォーム上でますます多くのアプリケーションがこの動作を必要とするためです。

最終的には、問題を緩和する方法はいくつかありますが、すべての解決策をキャッチする方法はありません。

  1. 背景を置き換えるときは、元の背景を取得します。それがビットマップの場合、recycle()です。 Drawableの場合は、参照をnullに設定し、setCallback経由でコールバックを削除します(オリエンテーションを変更したり、アクティビティを切り替える場合は特に重要です)。

  2. グラフィックスは、最もメモリを消費するリソースの1つです。 DrawableまたはBitmapを使用している場合は、1ピクセルあたり4バイトを使用します。しかし、画像が適切に表示されるようにサイズを変更する必要がある場合は、アプリケーションがアップサイジングであるかダウンサイジングであるかにかかわらず、実際にはかなり多く使用されます。高解像度でグラフィックを作成するのはすばらしいですが、モバイルデバイスの場合、実際に使用するサイズにスケーリングする必要があります。

  3. 多くのグラフィックを使用している場合は、表示されるものだけを使用することを検討することがあります。つまり、アイテムが32個あり、3個しか表示されていない場合は、表示されている3個のアイテムとすぐ隣のアイテムをロードします。レイジーローディングは、標準化されたいくつかのコントロールに対して実装できます。

  4. .9.pngファイルを見ることをおすすめします。これらはグラフィックスを最適化するのに最適です。

  5. ボタンにテキストがある場合は、グラフィックファイルに描画しないでください。 Androidにグラフィックスファイルにテキストを配置させる。その処理方法は大きく異なり、メモリ消費量も大幅に削減されています。グラフィックスを圧縮フォーマットではなくフラットビットマップにすることが望ましい場合があります。グラフィックスを圧縮フォーマットではなくフラットビットマップにすることが望ましい場合もあります。これにより、プロセッサとメモリの負荷は軽減されますが、ファイルサイズを犠牲にします。これは、圧縮されたフォーマットを使用するためにメモリ内で解凍する必要がありますが、ファイルが実際に閉じられるまでメモリは解放されないためです。 (これには、解凍に使用されるランタイムコード用のメモリも含まれていないし、グラフィックのサイズを変更する必要があるときにはさらにコストがかかる)。

  6. 余分なSystem.gc()ステートメントを追加すると、負荷を軽減するのに役立ちますが、最も早い時点でガベージコレクションの準備ができていることをシステムに通知するだけなので、信頼できません。

  7. 最後に、デバイスの解像度に応じて複数のサイズを設定できます。これはあなたのアプリを介して送信できる情報です。これは、ローカルアプリケーションで複数のデバイスをサポートする必要がある方法です。

これらの提案はすべて役に立ちますが、多くの情報があります。うまくいけば、私はあなたのニーズに応えるソリューションを実装するために十分にあなたを与えました。このことができます

希望、 FuzzicalLogic

+0

お返事ありがとうございます。確かにその情報の多くは、いくつかが役立つかもしれません。私が最初に考えたのは、使用しているオリジナルがかなり大きいので、1つの密度で拡大縮小されるようにイメージのサイズを変更することでした。私はこれがどのように役立つかを見ていきます。そして、次に9つのパッチを当てるでしょう。大きな問題は、システムがすべてのフィールドを処理できるようにする(getView()でバックグラウンドリソースを設定するだけで)、ListViewはすばやくスクロールしすぎてしまいます。 – Mimminito

0

(あなたは、固定背景画像を持っている場合)たぶん、あなたが透明にcacheColorHintを設定している:android:cacheColorHint="#00000000"。私にとっては、それは何度もGCを呼び出していました。

は、私は、次のプロパティを設定するアンドロイドのリストビューのキャッシングと滑らかなリストのスクロールを無効にすることを見出した(GCが呼び出されないことが多い、それ以上):また、uはデフォルトを取り除きたい場合は

android:scrollingCache="false" 
android:animationCache="false" 

選択色は次のとおりです。

android:listSelector="#00000000" 
関連する問題