2

アプリがクラッシュする原因となるメモリの問題が発生しています。MainActivity では、ImageView に大きなビットマップがありますが、大きなビットマップを持つ他のアクティビティにいるとクラッシュが発生します。

MainActivity を離れて別のアクティビティに移動する場合、ビットマップを null に設定する必要がありますか?

@Override
protected void onStop() {
    super.onStop();
    myImageView.setImageBitmap(null);
}

または、Java GC を利用して、ビットマップに割り当てられたメモリをリサイクルできますか?

4

4 に答える 4

0

以下の方法を使用して、すべてのビューを再帰的にバインド解除します。ルート ビューを渡す必要があります。その後、そのすべての子が消去されます。このメソッドにさらに要素を追加して、ビットマップのリサイクル、Web ビューの破棄、リスナーの消去などを行うことができます。

public static void unbindDrawables(View view) {
    try {
        if (view != null) {
            if (view.getBackground() != null) {
                view.getBackground().setCallback(null);
            }
            if (view instanceof ImageView) {
                view.setImageBitmap(null);
            } else if (view instanceof ViewGroup) {
                for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                    unbindDrawables(((ViewGroup) view).getChildAt(i));
                }
                ((ViewGroup) view).removeAllViews();
            }
        }
    }
    catch (Exception e) {
        // some ViewGroups don't support the removeAllViews method
    }
}
于 2013-06-10T12:15:21.907 に答える
0

他のアクティビティを呼び出す直前に、finish();メソッドを使用します。これにより、現在のアクティビティが閉じられ、リソースが利用可能になります。

于 2013-06-07T23:09:16.920 に答える