0

私のタブレットアプリは非常に大きな画像(2500x6000)を表示し、ユーザーがパン、ズームイン、ズームアウトできるようにする必要があります。それはメモリに収まらないので、私はそれをタイルに分割し、必要に応じてそれらをロードしています。私が遭遇している問題は、ビットマップをアンロードまたは置換するたびにガベージコレクションが発生し、アプリが目立って途切れることで一時停止することです。誰かがこれを回避するための賢い方法を思いついたのだろうかと思いましたか?BitmapFactory.decodeResourceを使用してビットマップを作成します。同じビットマップを置き換えようとしましたが、ガベージコレクションは引き続き実行されます(古いビットマップをダンプして新しいビットマップに置き換えると仮定します)。

ありがとう!

4

4 に答える 4

1

答えを見つけました!API11 +では、BitmapFactory.Optionsには、コンテンツのロード時にビットマップを再利用するinBitmapという属性があります。私はそれをそのように実装しました:

mBg[i] = Bitmap.createBitmap(800, 1232, Bitmap.Config.RGB_565);
mBgOptions[i] = new BitmapFactory.Options();
mBgOptions[i].inBitmap = mBg[i];
mBgOptions[i].inPreferredConfig = Bitmap.Config.RGB_565;
mBgOptions[i].inMutable = true;
mBgOptions[i].inSampleSize = 1;

ガベージコレクターは実行されなくなり、一時停止は削除されました。fyiとして、inSampleSizeを設定する必要があります。そうしないと、機能しません。

于 2012-02-06T21:30:17.747 に答える
0

Android 3.0をターゲットにしている場合、この回答が役立つ場合があります。

Android 3.0より前では、タイル画像のHTMLページを作成し、組み込みのブラウザで画像の読み込みと読み込みを処理することができました。ここでの私の答えには、もう少し詳細があります。

他の誰かが別のアプローチを持っていますか?

于 2012-02-06T17:30:50.010 に答える
0

android:largeHeap = "true"を使用していますか?それはGCの頻度を減らすかもしれません。また、タブレットをターゲットにしている場合は、同時ガベージコレクターを扱っていると安全に想定できます。したがって、収集するメモリのチャンクが多く、小さい場合、つまりタイルが小さい場合に最適に機能します。

于 2012-02-06T18:26:14.077 に答える
0

私はこの簡単に整数化できるWorldMapアプリケーションのソースを使用しました。

https://github.com/johnnylambada/WorldMap

これは世界地図の巨大な画像を使用し、キャッシュを使用して地図を表示します。

整数化するために、すべてのJavaファイル(おそらく5つ)をコピーして、レイアウトファイルでsurfaceViewを使用しました。次に、ImageViewerActivity.javaの小さなOnCreate()メソッドを実行し、アクティビティでコードを使用しました(個人的な使用に応じて、わずかな変更を加えました)。

于 2014-02-20T08:03:38.060 に答える