2

実際、アプリでメモリ不足エラーに直面しています.:(問題は、アプリで多くのアクティビティを使用していて、この時点で別のアプローチに移動できないことです..:(したがって、27 または29 個のアクティビティ setContentView() の 30 個のアクティビティで OOM エラーが発生します。すべての XML ファイルで、各レイアウトのメイン ページに背景画像を設定する AbsoluteLayout を使用しています。そして、すべてのレイアウトで、背景を持つ 4 ~ 5 個のボタンを設定しています。 image. これで、すべてのボタンに音声付きの画像が設定されました。

4

3 に答える 3

4

私が Android アプリの開発で見つけた最も一般的なエラーの 1 つは、「java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget」エラーです。このエラーは、方向を変更した後、多くのビットマップを使用するアクティビティで頻繁に見つかりました。アクティビティは破棄され、再度作成され、ビットマップに使用できる VM メモリを消費する XML からレイアウトが「膨張」します。

以前のアクティビティ レイアウトのビットマップは、アクティビティへの相互参照があるため、ガベージ コレクターによって適切に割り当て解除されません。多くの実験の後、私はこの問題の非常に良い解決策を見つけました。

まず、XML レイアウトの親ビューに「id」属性を設定します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:id="@+id/RootView"
 >
 ...

次に、Activity の onDestroy() メソッドで、unbindDrawables() メソッドを呼び出して親ビューへの参照を渡し、System.gc() を実行します。

@Override
protected void onDestroy() {
super.onDestroy();

unbindDrawables(findViewById(R.id.RootView));
System.gc();
}

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();
    }
}

この unbindDrawables() メソッドは、ビュー ツリーを再帰的に調べます。

Removes callbacks on all the background drawables
Removes childs on every viewgroup

この解決策は私のために働く

于 2012-09-28T11:41:50.073 に答える
2

を使用することをお勧めします。別のアクティビティにジャンプするたびに、使用済みのリソースがクリアされ、解放されますsystem.gc()finish();okすると、アプリでメモリ不足エラーは発生しません。これを試してみてください。

幸運を祈ります

このリンクを使用して、より良いソリューションを入手してください

メモリ/リソースリークを見つけるのに最適なAndroidのツールと方法は何ですか?

于 2012-09-28T11:13:58.067 に答える