1

さまざまな状況でのAndroidのOOMに関する多くの質問、フォーラムがあることは知っていますが、完全な解決策を見つけることができませんでした。

ユーザーが多くのアニメーション間をスクロールできるアクティビティがあります。スクロール時にアニメーションのみが移動する必要があり、最初はユーザーの操作なしで移動する必要があるため、アニメーションを内部に持つViewFlipperを使用しました。次の画像が概略的に示すように: ここに画像の説明を入力してください

問題は、3.0を超えるタブレットやデバイスでは、いくつかのアニメーションを反転して再生した後にOOMがスローされることです。問題を解決するために私が今まで試したこと:

  1. を使用してアニメーション画像を縮小しました(チュートリアル「ラージビットマップの効率的な読み込みBitmapFactory.Options」チュートリアルに従いました)。チュートリアルで実装しなかったのはキャッシングだけです。
  2. アニメーションが多く、ビットマップが非常に多いため、一度にロードするアニメーションは3つだけです(現在のビュー、左側と右側のビュー)が、ビットマップの追加と削除によってアプリの速度が大幅に低下しました。
  3. ガベージコレクターを作成して、役立つ可能性のあるすべてのものを手動で呼び出すことにより、画像をより速くリリースしようとしました:setCallback(null)、、、 (AdViewの最後の2つ)。(ビットマップ用に)試しましたが、他の例外が発生しましたsetImageDrawable(null)destroy()destroyDrawingCache()recycle()

上記の変更後、いくつかの改善がありますが、エミュレーターAndroid 4.x WVGA854またはWVGA800でOOMを受け取ります(長期間経過した後)。ただし、OOMをスローしない場合でも、メモリプロファイリングでは、最初は問題があったデバイスに80%の負荷がかかっていることが示されます。さらに、アニメーションの削除と追加により、すべてのデバイスでユーザーエクスペリエンスが低下します。

私はもっ​​とアーキテクチャ/デザインの問題だと思い始めています。エミュレータの問題かもしれませんか?DDMSの観点よりも優れたメモリプロファイラーがありますか?

私はどんな提案にも非常に感謝します、私は他に何を試すべきかわかりません:)

4

1 に答える 1

2

通常、メモリ不足の問題を防ぐためにこれを使用しています

bmp.recycle();
bmp = null;
System.runFinalization();
Runtime.getRuntime().gc();
System.gc();

ビットマップを使用した後に呼び出しています

それでもうまくいかない場合は、実際のデバイスで試してみてください。

于 2012-10-18T08:51:33.673 に答える