0

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

どうすればこれを機能させることができますか?すでにメモリリークをチェックしましたが、何もありません...

4

0 に答える 0