1

問題

ビットマップと、各位置で複数回 getView() を呼び出すリストビューの動作に問題があります。

私のリストにはビットマップのみが含まれており、リモートの場所から非同期に取得しています。ここで、リストビューが表示されると、getView() が各位置に対して (スクロールなしで) 約 4 回呼び出されるため、同じ位置に対して 4 つの異なるビットマップ インスタンスがインスタンス化され (そして 1 つだけを使用します...)、これによりアウトが発生します。メモリエラーの。

私が試したこと

私はすでにビットマップキャッシュを持っていますが、これは最初に画像を取得する前に発生します。たとえば、listView が開かれ、位置 0 のビットマップに対して 4 つの要求が行われ、これが到着すると、ビットマップがキャッシュに保存されます。この後、問題は解決しました。しかし、私の問題は、初めて 4 つのビットマップを作成することです (アイテム 0、アイテム 1、アイテム 2、アイテム 3 -> 16 個のビットマップ、そして 4 つだけ必要でした)。

「待機中」のimageViewのリストを実装し、1つだけをフェッチしてから、待機中のすべてのイメージビューにビットマップを設定するなど、これを解決するためのいくつかの戦略をすでに試しましたが、これにより新しい問題が発生し、同期も困難です。

また、リストビューの既にフェッチされた位置を含むリストフィールドを追加しようとしました.1回だけフェッチして設定するために、getView()は毎回異なる画像ビュー(など)を生成するようです(私はconvertViewをリサイクルしていますが、とにかく)、空の位置で終了するためです(ただし、すべてのビットマップがフェッチされ、インスタンス化され、イメージビューの1つに設定されます)。これを解決するために、位置を ImageView のリストにマップするマップ フィールドを使用し、1 つの位置を要求するすべての imageView にビットマップを設定しました。動作するはずですが、動作しません。ほとんどの位置で正しいビットマップを取得しますが、たとえば、リストの最初の位置では、最後に表示された位置からビットマップを取得します (すばやく切り替えられることがわかります。最初に位置 0、次に 1 からビットマップが表示されます。次に 2、次に 3 (最後に表示された位置)。

私の頭に浮かぶ別の可能性はありますが、(他の解決策と同様に)ひどい解決策のように感じますが、ビットマップをプリフェッチすることです。リストがスクロールする前に、次のxビットマップがキャッシュにあります。これは scrolllistener と組み合わせて実装され、スクロールによって次の x 個のアイテムがフェッチされ、キャッシュに入れられます。そのため、リストが getView() を呼び出すと (どんなに頻度が低くても)、キャッシュから同じプリフェッチされたビットマップ インスタンスが常に取得されます)。

Web から取得したビットマップを含むリスト/グリッド ビューは非常に一般的であるため、この問題を抱えているのは私だけではありません...

解決策はありますか?前もって感謝します。

4

1 に答える 1

0

この動作は、最初に表示されるアイテムに対してのみ発生することに気付きました。リストを最後までスクロールすると、まだgetView()最初のアイテムが呼び出され続けますが、残りのアイテムは 1 回だけ呼び出されます。

最初のリスト項目については、ビットマップをプリロードするのが理にかなっている可能性があるため、リストが を呼び出したときに既にメモリ内にあり、getView()インスタンス化されません。今のところ、この問題がデバイスをクラッシュさせないように、アプリケーションの他の部分でのメモリ使用量を改善しました。

于 2012-08-14T22:38:35.303 に答える