私の Android アプリには、背景付きのレイアウトがあります。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/menu_background"
android:id="@+id/frame"
>
...
背景画像は png です (ldpi の場合は 240x400、mdpi の場合は 320x480 など...)。
jpgを使ってみたのですが、見栄えが悪いのでpngに戻しました。
向きを変更すると、数回正常に動作し、アプリは次のエラーをスローして強制的に閉じます。
dalvikvm-heap(16260): 148960-byte external allocation too large for this process.
VM won't let us allocate ... bytes
java.lang.RuntimeException: Unable to start activity ComponentInfo...
それで、onDestroy メソッドでドローアブルをバインド解除するだけで修正できると思いましたよね?いいえ、いいえ... onDestroyに次のメソッドがあります。
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.frame));
Runtime.getRuntime().gc();
}
private void unbindDrawables(View view) {
if(view==null)
return;
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));
}
try{
((ViewGroup) view).removeAllViews();
}catch(UnsupportedOperationException mayHappen) {
Log.e("Error:", mayHappen.getMessage());
}
}
}
どうすればこれを機能させることができますか?すでにメモリリークをチェックしましたが、何もありません...