0

ある種のローカルバックグラウンドを使用するアプリを開発しています。アイデアはこれを変更可能にすることです。私はこのコードを使用して「背景」を変更することができます。

Bitmap bMap = BitmapFactory.decodeFile(sharedPreferences.getString("PICTURE", ""));
        Drawable d =new BitmapDrawable(bMap);
        bac.setBackgroundDrawable(d);
        } 

問題は、「バックグラウンド画面」に戻るたびに、OutOfMemoryErrorが原因でアプリがクラッシュすることです。次に、新しい背景が表示されます。アプリがクラッシュしないようにするための何らかのコードが必要です。私はこれをImageViewで管理していますが、LinearLayoutでは管理していません。ImageViewの場合、次のコードを使用します。

Bitmap bMap = BitmapFactory.decodeFile(sharedPreferences.getString("PICTURE", ""));
    image.setImageBitmap(bMap);

そしてそれがクラッシュするのを避けるために:

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

unbindDrawables(findViewById(R.id.iv_pic));
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();
    }
}
@Override
protected void onDestroy() {
super.onDestroy();

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

}

LinearLayoutに対して同じことを行うにはどうすればよいですか?

4

1 に答える 1

0

SOについては、OOM例外とその対処方法について多くの質問があります。質問を投稿する前に、フォーラムを検索してください。

いくつかのメモ:

  1. Bitmapメソッドを使用して消費されたメモリを解放できrecycleます(コードでは、を呼び出すことができますbMap.recycle()
  2. あなたはあなたのLinearLayout使用への参照を取得し、それを同様findViewByIdのものに渡すことができますunbindDrawablesunbindDrawables(findViewById(R.id.myLinearLayoutId));
于 2012-04-24T15:17:03.787 に答える