0

我正在为平板电脑 (1024x768) 开发 Android 应用程序。我在这里搜索并找到了一些解决方案,但有人解决了我的问题。该应用程序有 5 个屏幕,每个屏幕都有一个我加载的 ImageView:

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="1024dp"
    android:layout_height="768dp"
    android:layout_centerHorizontal="TRUE"
    android:src="@drawable/scene1"
    />

第一个和第二个屏幕加载良好,但是当我尝试加载第三个屏幕时,出现以下错误(我通过 startActivity 加载的每个屏幕其布局。这不是布局错误,因为如果我以不同的顺序加载它们,我也可以加载两个和第三个 crase):

05-28 17:03:51.774: E/AndroidRuntime(401): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown>

05-28 17:03:51.774: E/AndroidRuntime(401): Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown>


05-28 17:03:51.774: E/AndroidRuntime(401): Caused by: java.lang.reflect.InvocationTargetException


05-28 17:03:51.774: E/AndroidRuntime(401): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我尝试了几件事:

 @Override
  public void onPause()
  {
    super.onPause();
    Log.i("URI", "Syste.gc");
    // yada yada yada...

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

但我总是得到错误。

图像为 PNG,其重量低于 50k。

有什么建议么?

谢谢!

4

3 回答 3

1

1024x768 是 DP 中的尺寸,像素数可能是高分辨率设备上的两倍。

如果您使用 bitmapfactory 解码 1024x768 图像,它将相对于密度缩放位图,因此您最终可能会得到 2048x1536 图像,这将占用大约 12MB。

如果无论设备分辨率如何,您总是希望图像具有相同的分辨率,而不是将其放在Drawable-nodpi文件夹中,这将导致它在解码时不会调整大小。

于 2012-05-28T15:51:49.247 回答
1

尝试在 onCreate() 方法中加载图像,而不是从 XML 加载它。

您是否尝试过先读取图像的尺寸和类型,然后加载该图像的缩小版本?

正如Android 开发人员资源所建议的那样。

于 2012-05-28T15:52:47.533 回答
0

首先,调用 System.gc() 不会真正让垃圾收集器通过,而且它确实会阻碍你的表现,所以我会限制自己如此广泛地使用它。如果您希望垃圾收集器清理图像,请改用 Wea​​kReferences,并将图像存储在 HashMap 上。

其次,尝试使用较小的映像,因为 VM 会很快崩溃。

于 2012-05-28T15:28:09.580 回答