Android: 如何解决OutOfMemoryError

Android: how to solve OutOfMemoryError

我正在为我的布局使用 NestedScrollView 来显示 TextView 作为 header 和 HorizontalScrollView 来显示可滑动的图片。
这是一个例子:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="none"
    android:layout_weight="1">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            android:textStyle="bold"
            android:text="Cable Crunches"
            android:id="@+id/cableCrunches"
            android:gravity="center"
            android:padding="3dp"
            android:textSize="18sp"/>

        <HorizontalScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/cableCrunches"
            android:id="@+id/cableCrunchesPics">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/cableCrunchesPics1"
                    android:src="@drawable/cable_crunches_1"/>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/cableCrunchesPics2"
                    android:src="@drawable/cable_crunches_2"/>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/cableCrunchesPics3"
                    android:src="@drawable/cable_crunches_3"/>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/cableCrunchesPics4"
                    android:src="@drawable/cable_crunches_4"/>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/cableCrunchesPics5"
                    android:src="@drawable/cable_crunches_5"/>

            </LinearLayout>
        </HorizontalScrollView>

    </RelativeLayout>

</android.support.v4.widget.NestedScrollView>

TextViewHorizontalScrollView 块在我的布局中使用了大约 15 次,在这个设计中我遇到了 OutOfMemoryError。
当我使用较少的这些块时,错误不会出现。

我已尝试最小化 PNG 文件的大小,但这并不能解决问题。
有没有我可以使用的任何其他布局不是所有 ImageView 都在应用程序开始时加载?

在应用程序标签的清单中添加这一行

 android:largeHeap="true"

也许这会对你有所帮助

是的,正如其他人所说。您可以使用不同的库来加载图像。我会推荐 Universal image Loader。 Link

您可以使用库来加载图像。我最喜欢的是 Glide 使用起来很简单 https://github.com/bumptech/glide.

因此您将以编程方式加载图像。您还可以更好地控制加载图像的方式、时间和位置。 Glide 还解决了我的 App 中的一些内存问题。

您需要使用 RecyclerView or ListViewImageView 作为行项目而不是 HorizontalScrollViewRecyclerView 将创建足够的 ImageView 来填满屏幕。当用户滚动时,它将重用现有的 ImageView

还可以考虑使用图像加载库来异步加载图像。 Glide or Picasso 是非常好的图书馆。