java.lang.OutOfMemoryError:位图大小超过VM预算 - android - 有多少图像?

Dan*_*ykt 4 memory layout android memory-management image

我正在开发一个Android应用程序,当我四处阅读并为自己学习时,我不能同时在屏幕上有很多图像,否则我将得到一个例外.

问题是图像中有多少图像或多少KB,或者我可以在屏幕上同时有多少布局/图像.

我知道这不是影响记忆的唯一因素,但我正在寻找一个数字,所以我可以计划一下.

谢谢

丹尼尔


编辑:

我刚刚在android开发网站上找到了这个(http://developer.android.com/resources/articles/future-proofing.html)

要避免的技术,#3:过度使用布局

由于View渲染基础架构的变化,布局中不合理的深度(超过10个左右)或宽度(总共超过30个)视图层次结构现在可能导致崩溃.这对于过于复杂的布局总是存在风险,但是在暴露这个问题时你可以认为Android 1.5优于1.1.大多数开发人员不需要担心这一点,但如果您的应用程序具有非常复杂的布局,则需要节省时间.您可以使用更高级的布局类(如FrameLayout和TableLayout)来简化布局.

我想这可能是我的问题.

当它说"广泛"时,是否在最后一级说?

谢谢

丹尼尔

hp.*_*oid 7

我发现开发Android应用程序的最常见错误之一是

java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget 错误.

我在更改方向后使用大量位图的活动经常发现此错误:活动被销毁,再次创建,布局从消耗可用于位图的VM内存的XML中"膨胀".

前一个活动布局上的位图未被垃圾收集器正确释放,因为它们已经交叉引用了它们的活动.经过多次实验,我发现了一个很好的解决方案.

首先,在XML布局的父视图上设置id属性:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@+id/RootView"
     >
     ...
Run Code Online (Sandbox Code Playgroud)

然后,在onDestroy() Activity 的方法上,调用unbindDrawables()方法将refence传递给父View,然后执行System.gc()

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

    unbindDrawables(findViewById(R.id.RootView));
    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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这个unbindDrawables()方法以递归方式探索视图树,并且:

  • 删除所有背景drawable上的回调
  • 删除每个视图组上的子项