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>
TextView
和 HorizontalScrollView
块在我的布局中使用了大约 15 次,在这个设计中我遇到了 OutOfMemoryError。
当我使用较少的这些块时,错误不会出现。
我已尝试最小化 PNG 文件的大小,但这并不能解决问题。
有没有我可以使用的任何其他布局不是所有 ImageView
都在应用程序开始时加载?
在应用程序标签的清单中添加这一行
android:largeHeap="true"
也许这会对你有所帮助
是的,正如其他人所说。您可以使用不同的库来加载图像。我会推荐 Universal image Loader。 Link
您可以使用库来加载图像。我最喜欢的是 Glide
使用起来很简单 https://github.com/bumptech/glide.
因此您将以编程方式加载图像。您还可以更好地控制加载图像的方式、时间和位置。 Glide 还解决了我的 App 中的一些内存问题。
您需要使用 RecyclerView or ListView 和 ImageView
作为行项目而不是 HorizontalScrollView
。 RecyclerView
将创建足够的 ImageView
来填满屏幕。当用户滚动时,它将重用现有的 ImageView
。
我正在为我的布局使用 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>
TextView
和 HorizontalScrollView
块在我的布局中使用了大约 15 次,在这个设计中我遇到了 OutOfMemoryError。
当我使用较少的这些块时,错误不会出现。
我已尝试最小化 PNG 文件的大小,但这并不能解决问题。
有没有我可以使用的任何其他布局不是所有 ImageView
都在应用程序开始时加载?
在应用程序标签的清单中添加这一行
android:largeHeap="true"
也许这会对你有所帮助
是的,正如其他人所说。您可以使用不同的库来加载图像。我会推荐 Universal image Loader。 Link
您可以使用库来加载图像。我最喜欢的是 Glide 使用起来很简单 https://github.com/bumptech/glide.
因此您将以编程方式加载图像。您还可以更好地控制加载图像的方式、时间和位置。 Glide 还解决了我的 App 中的一些内存问题。
您需要使用 RecyclerView or ListView 和 ImageView
作为行项目而不是 HorizontalScrollView
。 RecyclerView
将创建足够的 ImageView
来填满屏幕。当用户滚动时,它将重用现有的 ImageView
。