0

我正在开发一个由不同屏幕组成的应用程序,我将其设计为具有不同布局的不同活动。对于每个屏幕,有两个大 (1536x2048) png 文件,用作覆盖背景(它们是 alpha 混合的)。目前,活动的布局 xml 文件是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/backgroundPic0" 
tools:context=".TakvimActivity" >

    <ImageView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/backgroundPic1" 
     />

</RelativeLayout>

目前,我能够从主要活动前往三个不同的活动。我只是简单地这样做

    Intent intent = new Intent(this, TakvimActivity.class);
    startActivity(intent);

我知道每次启动新活动并setContentView调用该方法时,背景图像都会消耗大约 24 MB 的内存。当我第一次前往新屏幕时,返回主屏幕并前往第二个新活动时,应用程序由于内存不足异常而崩溃,并显示“在 blabla-byte 分配上内存不足”。(请注意,它不会完全在第二个 Activity 转换时崩溃,有时在第三个转换时会崩溃。)在我看来,当我从一个活动。我检查了当前活动是否通过覆盖onDestroy方法,我看到它被正确调用。GC 不应该在 Activity 被销毁时清除所有与 UI 相关的内存,因为对其视图层次结构的引用被删除了吗?是否有我遗漏的东西,例如,是否有明确的方法来清除我的代码中没有包含的 Activity 的内存?

4

2 回答 2

1

如果 imageview 本身是 GC 的,那么问题对我来说就消失了。在 imageview 本身上调用 unbindDrawables 是不够的。

另请参阅我的答案here

PagerAdapter Android Lollipop 上的 unbindDrawables 不起作用

和我的类似但 Android Studio 集中的问题在这里

泄漏的未引用字节 [] 最初来自位图,但被回收()导致内存泄漏(直到活动停止)

于 2016-01-26T10:24:17.613 回答
0

尝试将以下方法添加到您的应用程序并从您的活动中调用它:

private void unbindDrawables(View view) {
    try
    {
        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();
          }         
        }
    catch(Exception e)
    {
        e.printStackTrace();            
    }

}

@Override
protected void onDestroy()
{
super.onDestroy();
//R.id.LayoutId is the id of the root layout of your activity   
unbindDrawables(findViewById(R.id.LayoutId)); 
    System.gc();

}
于 2013-03-25T15:13:35.947 回答