1

かなり大量のビットマップを使用するアクティビティ (activity1) があります。ビットマップをロードする別のアクティビティもあります (activity2)。一部の電話で実行すると、アクティビティ 2 で OOM エラーが発生します。activity1のレイアウトが原因であるというエラーを追跡しました。アクティビティ 1 のすべてのビットアンプを取り出し、それらを 16 進数の色だけに置き換えると、アクティビティ 2 で OOM エラーは発生しません。

したがって、このことから、activity1 の onPause または onDestroy メソッドが呼び出されたときに、activity1 で使用しているビットマップがヒープから削除されていないと想定しています。これまでのところ、ここから回答を試しましたが、それでも OOM エラーが発生します。これまでの onPause および onResume メソッドは次のとおりです。

@Override
protected void onPause() {
    mCache.onPause();
    mContext = null;

    mTimer.cancel();
    mTimer = null;

    unbindDrawables(findViewById(R.id.home_root));
    System.gc();

    super.onPause();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
    ((ViewGroup) view).removeAllViews();
    }
}

@Override
protected void onResume() {
    super.onResume();
    setContentView(R.layout.homescreen);
    createButtons();
    mCache.onResume();
    performAnimation(false);

    mTimer = new Countdown();
    mTimer.start();
}

これを修正する方法についての提案は大歓迎です! ありがとう。

4

1 に答える 1

0

メモリにロードされたすべてのビットマップに対してこのメ​​ソッドを使用できますが、bitmap.recycle()後でそれらを使用するときに再度ロードすることを確認してください。

ドキュメントによるとrecycle()、Java でメモリを手動で管理しようとするのは悪い習慣と見なされるため、このメソッドは使用しないでください。System.gc()ただし、これを に表示されている呼び出しと組み合わせて使用​​すると、onPause()理論的には、不要なビットマップを明示的に指定することで、問題のある電話の GC プロセスを高速化できます。

スニペットにビットマップ コードが表示されません。もう少し情報があれば、問題を明確にするのに役立つかもしれません。

于 2012-07-29T19:50:32.540 に答える