2012-01-26 9 views
1

私は多くの小さな(128x128px @ 24ビットなど)PNG画像をビットマップとして読み込み、ビューに描画するAndroidアプリを設計しています。たくさんあります - 3000x3000pxの地図を結びました!Androidアプリ内からガベージコレクションをキャッチしていますか?

マップはマップの最初の部分を見るときにのみ.pngファイルからビットマップを読み込み、描画する必要があります。それまでは、ロードされていません。

オフラインで一定時間画像をアンロード(Bitmap.recycle())できないようにするには、マップをスクロールしているユーザーがすぐにアプリケーションをいっぱいにしますヒープ。

GCがビットマップイメージをカプセル化するクラスで実行したいときにキャッチする方法はありますか?そのため、閾値時間を超えてオンスクリーンになっていないビットマップを手動でアンロードできますか?明らかに、Dalvik GCはライブ参照を常に持っているので、画像自体をアンロードしません。

(PS:私は自分自身への挑戦としてGoogle Maps APIを使用していませんが、衛星画像などの描画をどのように扱うのか興味深いでしょう。

答えて

2

時間に基づいて画像をアンロードするのではなく、距離に基づいて画像をアンロードするのはなぜですか?視覚的境界の外側にあるタイルが遠ければ遠いほど、すべての動きがスクロールであると仮定して、すぐに必要とされる可能性は低くなります。可視領域以外に4つのタイルなどのしきい値を選択し、その境界外にあるイメージをアンロードすることができます。

スクロールすると、別のローをロードする必要があると同時に、1つの行または列のタイルをアンロードすることができるため、合計メモリ使用量は一定のままです。

+0

これに加えて、ロードアンロードイメージを別のスレッドに移動することをお勧めします。私はテレビガイド(何千ものテレビ番組のプレビューをスクロールする)のためのそのような振る舞いを実装し、アプリケーションのスピードを大幅に改善しました。 – OleGG

+0

私はこれがGoogleマップの機能だと思います。 – Wyzard

+0

私はGoogle Mapsが膨大な量のネイティブコードを使用していると思うので、ここではすべての画像処理が「低レベル」に置かれています。 – OleGG

0

私はガベージコレクタに頼ることはお勧めできませんが、これは不当に呼び出すことができるためです。アプリで実行されるコードを用意して、画像をチェックしたり、必要に応じてアンロードしたりする方がよいでしょう。

関連する問題