的OutOfMemoryError装载活动时,OutOfMemoryError

2023-09-06 06:37:24 作者:闹够了就来我怀里i

我有这样一个非常简单的活动:

I have a quite simple activity like this :

public class SurvivalActivity extends Activity {
    private static final String KEY_LAYOUT_ID = "SurvivalLayoutId";
    int mLayoutId;
    private static final int[] mSurvivalLayouts = {
        R.layout.survival1,
        R.layout.survival2,
        R.layout.survival3,
    };

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Intent i = getIntent();
        if (savedInstanceState != null && savedInstanceState.containsKey(KEY_LAYOUT_ID)) {
            mLayoutId = savedInstanceState.getInt(KEY_LAYOUT_ID, 0);
        } else if (i != null) {
            mLayoutId = i.getIntExtra(KEY_LAYOUT_ID, 0);
        } else {
            mLayoutId = 0;
        }

        // Layout
        setContentView(mSurvivalLayouts[mLayoutId]);

        // Title
        Util.setTitleFont(this, findViewById(R.id.title));

        // "Next" button
        final View nextButton = findViewById(R.id.survival_next);
        Util.setFont(this, nextButton, "Lobster.ttf");
        nextButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(final View v) {
                final Intent next = new Intent(SurvivalActivity.this, SurvivalActivity.class);
                next.putExtra(KEY_LAYOUT_ID, (mLayoutId + 1) % mSurvivalLayouts.length);
                startActivity(next);
                finish();
            }
        });
    }

    @Override
    protected void onSaveInstanceState(final Bundle outState) {
        outState.putInt(KEY_LAYOUT_ID, mLayoutId);
    }
}

这两种的Util。的 * 的静态方法只是改变的字体的TextView

The two Util.* static methods just change the font of the TextView.

所有3布局是相当简单的,让我告诉你第一:

All 3 layouts are rather simple, let me show you the first :

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            style="@style/Title"
            android:text="@string/surv1_title" />

        <TextView
            style="@style/Content"
            android:text="@string/surv1_1" />

        <ImageView
            style="@style/Picture"
            android:src="@drawable/surv_crafting" />
        <TextView
            style="@style/PicLegend"
            android:src="@string/surv_crafting_leg" />
        <ImageView
            style="@style/Picture"
            android:src="@drawable/surv_hache" />
        <TextView
            style="@style/PicLegend"
            android:src="@string/surv_hache_leg" />
        <ImageView
            style="@style/Picture"
            android:src="@drawable/surv_pioche" />
        <TextView
            style="@style/PicLegend"
            android:src="@string/surv_pioche_leg" />

        <TextView
            style="@style/Content"
            android:text="@string/surv1_2" />

        <ImageView
            style="@style/Picture"
            android:src="@drawable/surv_charbon" />
        <TextView
            style="@style/PicLegend"
            android:src="@string/surv_charbon_leg" />

        <TextView
            style="@style/Content"
            android:text="@string/surv1_3" />

        <ImageView
            style="@style/Picture"
            android:src="@drawable/surv_torch" />
        <TextView
            style="@style/PicLegend"
            android:src="@string/surv_torch_leg" />

        <TextView
            style="@style/Content"
            android:text="@string/surv1_4" />

        <ImageView
            style="@style/Picture"
            android:src="@drawable/surv_abri" />
        <TextView
            style="@style/PicLegend"
            android:src="@string/surv_abri_leg" />

        <TextView
            style="@style/Content"
            android:text="@string/surv1_5" />

        <Button
            style="@style/SurvivalBoxNext"
            android:text="@string/surv1_next" />

    </LinearLayout>
</ScrollView>

正如你所看到的,它只是几个的TextView s的的ImageView S和A 按钮触发下一个活动的负载。

As you can see it's just several TextViews with ImageViews, and a Button that triggers the load of the next activity.

我启动应用程序,它显示的第一个屏幕。我向下滚动到按钮,单击时,显示第二个屏幕(带打嗝)。我向下滚动到按钮,点击,和繁荣。

I launch the app, it displays the first screen. I scroll down to the button, click, the second screen is displayed (with a hiccup). I scroll down to the button, click, and boom.

03-02 16:36:46.488 E/AndroidRuntime(10611): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.bicou.myapp/net.bicou.myapp.SurvivalActivity}: android.view.InflateException: Binary XML file line #72: Error inflating class <unknown>
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.os.Looper.loop(Looper.java:137)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.ActivityThread.main(ActivityThread.java:4340)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at java.lang.reflect.Method.invokeNative(Native Method)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at java.lang.reflect.Method.invoke(Method.java:511)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at dalvik.system.NativeStart.main(Native Method)
03-02 16:36:46.488 E/AndroidRuntime(10611): Caused by: android.view.InflateException: Binary XML file line #72: Error inflating class <unknown>
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.createView(LayoutInflater.java:606)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.Activity.setContentView(Activity.java:1835)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at net.bicou.myapp.SurvivalActivity.onCreate(SurvivalActivity.java:34)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.Activity.performCreate(Activity.java:4465)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
03-02 16:36:46.488 E/AndroidRuntime(10611):     ... 11 more
03-02 16:36:46.488 E/AndroidRuntime(10611): Caused by: java.lang.reflect.InvocationTargetException
03-02 16:36:46.488 E/AndroidRuntime(10611):     at java.lang.reflect.Constructor.constructNative(Native Method)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.view.LayoutInflater.createView(LayoutInflater.java:586)
03-02 16:36:46.488 E/AndroidRuntime(10611):     ... 25 more
03-02 16:36:46.488 E/AndroidRuntime(10611): Caused by: java.lang.OutOfMemoryError
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.Bitmap.nativeCreate(Native Method)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.content.res.Resources.loadDrawable(Resources.java:1937)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.widget.ImageView.<init>(ImageView.java:119)
03-02 16:36:46.488 E/AndroidRuntime(10611):     at android.widget.ImageView.<init>(ImageView.java:109)
03-02 16:36:46.488 E/AndroidRuntime(10611):     ... 28 more
03-02 16:36:46.520 W/ActivityManager(  211):   Force finishing activity net.bicou.myapp/.SurvivalActivity

我不明白:

为什么previous活动不中解脱出来,腾出一些空间 为什么我的应用程序占用了这么多堆(成长堆(破片的情况下),以60.869MB为3600016字节分配) 我该怎么做才能显示含有先后3活动,每次约10 的TextView 和10 的ImageView 取值 如果我做错了什么,因为我看不出什么错在我的code,但显然有些不妥。 Why the previous activities are not freed to free up some space Why is my app taking up so much heap (Grow heap (frag case) to 60.869MB for 3600016-byte allocation) How can I do to display successively 3 activities containing each about 10 TextViews and 10 ImageViews If I did something wrong, because I can't see anything wrong in my code, but there is obviously something wrong.

感谢你。

编辑:第一个活动的照片大小:

picture sizes of the first activity:

-rw-r--r--  1 bicou  staff   167197 29 fév 16:42 surv_abri.jpg 600x377 px
-rw-r--r--  1 bicou  staff    24658 29 fév 16:42 surv_charbon.png 559x277 px
-rw-r--r--  1 bicou  staff     5285 29 fév 16:42 surv_crafting.png 214x121 px
-rw-r--r--  1 bicou  staff     4190 29 fév 16:42 surv_hache.png 214x121 px
-rw-r--r--  1 bicou  staff     3809 29 fév 16:42 surv_pioche.png 214x121 px
-rw-r--r--  1 bicou  staff     2252 29 fév 16:42 surv_torch.png 215x121 px

第二项活动:

Second activity:

-rw-r--r--  1 bicou  staff     3371 29 fév 16:42 surv_four.png 204x112 px
-rw-r--r--  1 bicou  staff     5059 29 fév 16:42 surv_glass.png 215x122 px
-rw-r--r--  1 bicou  staff     3176 29 fév 16:42 surv_malle.png 204x112 px
-rw-r--r--  1 bicou  staff     2676 29 fév 16:42 surv_pelle.png 204x112 px
-rw-r--r--  1 bicou  staff   167166 29 fév 16:42 surv_repere.png 528x331 px
-rw-r--r--  1 bicou  staff   134706 29 fév 16:42 surv_sand.jpg 854x480 px

第三个活动(崩溃):

Third activity (crashing):

-rw-r--r--  1 bicou  staff    58919 29 fév 16:42 surv_1.jpg 600x377 px
-rw-r--r--  1 bicou  staff    51144 29 fév 16:42 surv_2.jpg 600x377 px
-rw-r--r--  1 bicou  staff    46917 29 fév 16:42 surv_3.jpg 600x377 px
-rw-r--r--  1 bicou  staff    53226 29 fév 16:42 surv_4.jpg 600x377 px
-rw-r--r--  1 bicou  staff    37787 29 fév 16:42 surv_5.jpg 600x377 px
-rw-r--r--  1 bicou  staff    31050 29 fév 16:42 surv_6.jpg 600x377 px
-rw-r--r--  1 bicou  staff    38389 29 fév 16:42 surv_7.jpg 600x377 px
-rw-r--r--  1 bicou  staff    44471 29 fév 16:42 surv_8.jpg 600x377 px

和窗口背景:

-rw-r--r--  1 bicou  staff    30857 29 fév 16:42 background_img.png

编辑:

确定 - 我试图直接从code膨胀的意见,才能看到,如果我有一个越野车的形象。这是我的活动code(仅变量+ 的onCreate 的其余部分是相同的)

OK — I tried inflating the views directly from code in order to see if I had a buggy image. Here's my activity code (only variables + onCreate as the rest is identical)

private static final int[] mTitles = {
    R.string.surv1_title, R.string.surv2_title, R.string.surv3_title
};
private static final int[][] mTextViews = {
    {   R.string.surv1_1, R.string.surv1_2, R.string.surv1_3, R.string.surv1_4, R.string.surv1_5 },
    {   R.string.surv2_1, R.string.surv2_2, R.string.surv2_3, R.string.surv2_4, R.string.surv2_5, R.string.surv2_6 },
    {   R.string.surv3_1, R.string.surv3_2, R.string.surv3_3 }
};
private static final int[][] mImageViews = {
    {   R.drawable.surv_pioche, R.drawable.surv_crafting, R.drawable.surv_hache, R.drawable.surv_charbon,
        R.drawable.surv_torch, R.drawable.surv_abri },
    {   R.drawable.surv_malle, R.drawable.surv_four, R.drawable.surv_pelle, R.drawable.surv_repere,
        R.drawable.surv_sand, R.drawable.surv_glass },
    {   R.drawable.surv_1, R.drawable.surv_2, R.drawable.surv_3, R.drawable.surv_4,
        R.drawable.surv_5, R.drawable.surv_6, R.drawable.surv_7, R.drawable.surv_8  },
};
private static final int[] mNextButtons = {
    R.string.surv1_next, R.string.surv2_next, R.string.surv3_next
};

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final Intent i = getIntent();
    if (savedInstanceState != null && savedInstanceState.containsKey(KEY_LAYOUT_ID)) {
        mLayoutId = savedInstanceState.getInt(KEY_LAYOUT_ID, 0);
    } else if (i != null) {
        mLayoutId = i.getIntExtra(KEY_LAYOUT_ID, 0);
    } else {
        mLayoutId = 0;
    }

    // Layout
    //setContentView(mSurvivalLayouts[mLayoutId]);
    LinearLayout ll;
    ScrollView sv;
    TextView tv;
    ImageView iv;
    Button b;

    sv = new ScrollView(this);
    sv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    tv = new TextView(this);
    tv.setId(R.id.title);
    tv.setText(getString(mTitles[mLayoutId]));
    ll.addView(tv);

    for (final int textId: mTextViews[mLayoutId]) {
        tv = new TextView(this);
        tv.setText(getString(textId));
        ll.addView(tv);
    }

    for (final int imgId: mImageViews[mLayoutId]) {
        L.i("Creating image: "+imgId);
        iv = new ImageView(this);
        iv.setImageResource(imgId);
        ll.addView(iv);
    }

    b = new Button(this);
    b.setText(getString(mNextButtons[mLayoutId]));
    b.setId(R.id.survival_next);
    ll.addView(b);

    sv.addView(ll);
    setContentView(sv);

    // Title
    Util.setTitleFont(this, findViewById(R.id.title));

    // "Next" button
    final View nextButton = findViewById(R.id.survival_next);
    Util.setFont(this, nextButton, "Lobster.ttf");
    nextButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(final View v) {
            final Intent next = new Intent(SurvivalActivity.this, SurvivalActivity.class);
            next.putExtra(KEY_LAYOUT_ID, (mLayoutId + 1) % mSurvivalLayouts.length);
            startActivity(next);
            finish();
        }
    });
}

正如你所看到的,我只是直接膨胀的意见,而(这是一个别名 Log.i(TAG,.. 。))表示什么是最后ImageView的任何崩溃之前夸大了。

As you can see I am just inflating the views directly, and L.i (which is an alias to Log.i(TAG, ...)) indicates what was the last ImageView inflated before any crash.

我跑的应用程序,看到的第一个活动,然后是第二个,并作为previously崩溃,而装载第三个。我在logcat中看到的最后一个ID是最后一张照片 R.drawable.surv_8 。这是一个630x377 JPEG文件,45昆明植物研究所。

I ran the app, saw the 1st activity, then the second, and as previously it crashes while loading the third one. The last ID I saw in the logcat was the last picture R.drawable.surv_8. This is a 630x377 jpeg file, 45 kiB.

我试图改变这样的看法顺序:

I tried to change the order of the views like this:

private static final int[][] mImageViews = {
    {   R.drawable.surv_pioche, R.drawable.surv_crafting, R.drawable.surv_hache, R.drawable.surv_charbon,
        R.drawable.surv_torch, R.drawable.surv_abri },
    {   R.drawable.surv_malle, R.drawable.surv_four, R.drawable.surv_pelle, R.drawable.surv_repere,
        R.drawable.surv_sand, R.drawable.surv_glass },
    {   R.drawable.surv_8, R.drawable.surv_1, R.drawable.surv_2, R.drawable.surv_3, R.drawable.surv_4,
        R.drawable.surv_5, R.drawable.surv_6, R.drawable.surv_7,  },
};

所以这surv_8是第一个。该应用程序仍然崩溃的最后一张照片,这是 R.drawable.surv_7 。所以这不是一个形象问题。

So that surv_8 is first. The app is still crashing at the last picture, which is R.drawable.surv_7. So that is not an image issue.

然后我删除的图片之一的 mImageViews [2] 让我只有7张图片,而不是8.应用程序工作正常:活动负荷当我按一下按钮我去下一个,并在最后我去的第一个。没有崩溃。

Then I removed one of the pictures out of mImageViews[2] so that I have only 7 pictures instead of 8. The app is working as expected: the activity loads, when I click the button I go to the next one, and on the last I go to the first. No crash.

我不过告诉大家,活动1和2的逗留到内存中。事实上,看看时序:

I can however tell that the activity 1 and 2 stay into memory. Indeed, have a look at the timings:

03-04 15:47:13.685 I/ActivityManager(17430): Displayed net.bicou.myapp/.SurvivalActivity: +2s570ms
03-04 15:47:36.834 I/ActivityManager(17430): Displayed net.bicou.myapp/.SurvivalActivity: +803ms
03-04 15:47:39.756 I/ActivityManager(17430): Displayed net.bicou.myapp/.SurvivalActivity: +1s476ms
03-04 15:47:44.201 I/ActivityManager(17430): Displayed net.bicou.myapp/.SurvivalActivity: +462ms
03-04 15:47:46.717 I/ActivityManager(17430): Displayed net.bicou.myapp/.SurvivalActivity: +474ms
03-04 15:47:48.599 I/ActivityManager(17430): Displayed net.bicou.myapp/.SurvivalActivity: +474ms

400毫秒,而不是1.5-2.5秒加载活性

400ms instead of 1.5-2.5 sec to load the activity.

这是为什么住到内存?

=> **我是否需要手动自由在的onDestroy所有图片()? **

=> ** Do I need to manually free all pictures upon onDestroy() ? **

=>您觉得这个做的:http://androidactivity.word$p$pss.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/ 有了这个解决方案,我可以加载像10位图全球范围内,我会释放一些在加载另一个活动?

=> What do you think about this: http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/ With this solution I could load like 10 bitmaps globally, and I would free some while loading another activity?

推荐答案

我很抱歉,这个问题的答案是不能够实际有我给我的问题的要素。

I'm sorry that the answer of this question wasn't actually possible to have with the elements I gave in my question.

事实上,正如在其他的问题在这里:为什么我所有的位图上采样200%?,我把我的照片在绘制文件夹,其中,像我这样的一个xhdpi屏幕上,会导致Android的上采样两遍(匹配xhdpi针对MDPI),并且将导致400%的内存使用情况(两次的宽度和高度的两倍,以便4倍多的像素)。

Indeed, as mentioned in another question here: Why are all my bitmaps upsampled 200%?, I put my pictures in the drawable folder, which, on a xhdpi screen like mine, will cause Android to upsample everything twice (to match xhdpi against mdpi), and will result in a 400% memory usage (twice the width and twice the height so 4 times as many pixels).

还有一件事,因为我不希望用户能够回去(请参阅完成()之后的 startActivity ()),这是我放在的onPause()

One more thing, since I don't want the user to be able to go back (see the finish() right after the startActivity()), here's what I put in the onPause():

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

这是一些code我来到这里的计算器(例如这里:Drawable VS单可重复使用的位图的内存比较好?)。

This is some code I got here on StackOverflow (for example here: Drawable vs Single reusable Bitmap better with memory?).

下面是我的话这个code,为什么每一行是很重要的:

Here are my remarks about this code and why every line is important:

setCallback(空)删除引用到活动,以便它可以被垃圾收集。如果你不这样做,所有的意见都会留在记忆。 您还需要从的onPause 调用它,因为的onDestroy 不能保证被调用。 您可能需要引起垃圾收集之后,为了帮助GC了解到,一些参考的对象所做的孤儿和可以GC'd。只需拨打的System.gc()。 The setCallback(null) removes the reference to the activity, so that it can be garbage collected. If you don't do this, all the views will stay in memory. You also need to call it from onPause, because onDestroy is not guaranteed to be called. You may need to cause a garbage collection after this, in order to help the GC understand that some references to objects that were made orphans and that can be GC'd. Just call System.gc().

这是得到的的onPause code,与具有ID的活动的主要布局 top_layout

This is the resulting onPause code, with the main layout of your activity having the id top_layout:

@Override
protected void onPause() {
    super.onPause();
    unbindDrawables(findViewById(R.id.top_layout));
    System.gc();
}