1

何千もの画像を含むパラパラ漫画スタイルのアニメーションを使用するアプリケーションがあります。APK のサイズは、アプリ ストアに配置されることのない内部専用アプリケーションであるため、問題になりません。

私が抱えている問題は、アニメーターがサブクラス化されたImageViewであり、毎秒 15 フレームで画像を切り替え、setImageURIガベージ コレクションを呼び出すたびに実行されることです。では、ガベージ コレクションを実行させないsetImageURIの代替方法はありますか?

編集:もう少し背景情報。

私のアプリには最大 12 のシーケンスがあり、そのうちの 6 つには 1609 個の画像が含まれており、特定のフレームでさまざまなイベントを呼び出す必要があります。もう 1 つのニーズは、ユーザーが任意のフレームで停止して状況を調査し、アクションを実行するか、シーケンスを続行できるようにすることです。3D エンジンは理想的なソリューションでしたが、ユーザーが完全な自由を必要とせず、常に「レール」に乗っているため、この方法が持ち出されました。

これがアプリケーションの本質であり、問​​題が発生する場所です

try {
   ((BitmapDrawable) getDrawable()).getBitmap().recycle();
   setImageURI(imgUri);
   refreshDrawableState();
} catch (Exception e) {
   e.printStackTrace();
}
4

2 に答える 2

1

あるイメージを別のイメージと交換して前のイメージをダンプするため、ガベージ コレクターが実行されています。画像への参照を失うたびに発生します。

考えられるいくつかの方法を次に示します。

  1. あなたはそれがフリップブックであると述べたので、フレームごとのアニメーションとして機能するAnimationDrawableをビルドしてに割り当てます(まさにフリップブックとは何ですか)。ImageViewこれにより、すべての画像が一度に読み込まれ、への参照が失われるまで保持されますAnimationDrawable

  2. すべての画像をSoftReferencesとして保存して、画像をキャッシュします。SoftReference は、メモリの収集が必要になるまでオブジェクトをメモリに保持します。これにより、ガベージ コレクターの頻度が低下します (これが原因であると仮定します)。を使用BitmapFractoryしてイメージを作成し、setImageBitmapそれを に割り当てImageViewます。これのもう 1 つの利点は、イメージを ImageView に割り当てる前に、スレッド上にイメージを構築できることです。

于 2012-09-17T19:58:00.353 に答える
0

おそらく、イメージに多くのメモリが必要であり、Android が GB を呼び出してメモリを解放し、プログラムのクラッシュを回避する必要があるためです。

于 2012-09-17T19:52:12.797 に答える