首页 > 解决方案 > Glide 不会加载所有图像(本地文件)(OutOfMemory)

问题描述

滑翔版 4.9.0

在我的应用程序中,我有 10 个活动。用户在每个活动上单击下一步以导航到下一个活动,直到他最终到达最后一个活动。前 5 个活动包含ImageViews.

前3个活动有一个大ImageView

活动四有 5 个较小的ImageViews.

活动五有 8 个较小的ImageViews.

_

要加载的图像位于drawable文件夹中的项目资源中。

在我使用之前Glide,我只是在我的 xml 文件中使用了 的android:src属性,ImageView当用户尝试使用 5 打开活动四时,这会导致 Galaxy S6 设备上出现以下错误ImageViews

java.lang.OutOfMemoryError:无法分配 10240012 字节分配,其中 6982184 空闲字节和 6MB 直到 OOM

所以我决定使用Glide将图像加载到ImageViews并删除android:src属性。图片看起来很模糊,所以我dontTransform()在我的陈述中添加了:

Glide.with(this).load(R.drawable.myImg1).dontTransform().skipMemoryCache(true).listener(new LoggingListener(getApplicationContext())).into(iv_p1);

在模拟器和我的物理设备(小米米 A2 Android 9)上,一切看起来都很好。Glide 唯一的缺点是你可以看到ImageViews一个接一个的加载他们的图像。

在投掷之前的 Galaxy S6 上OutOfMemoryError,所有的活动都显示没有任何错误。但只有 8 个中的前 4 个 ImageViews加载了他们的图像。我假设 RAM 仍然是一个问题,而 Glide 只是通过停止加载图像来防止溢出。所以我将图像文件的大小从 500x500 调整为 200x200。

现在 8 个中的前 6 个 ImageViews加载了他们的图像。

LeakCanary没有显示任何泄漏。

Glide 的错误日志:

Failed to load resource
There were 4 causes:
java.lang.OutOfMemoryError(Failed to allocate a 26214412 byte allocation with 932280 free bytes and 910KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 26214412 byte allocation with 922168 free bytes and 900KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 2560012 byte allocation with 914680 free bytes and 893KB until OOM)
java.lang.OutOfMemoryError(Failed to allocate a 2560012 byte allocation with 937496 free bytes and 915KB until OOM)
call GlideException#logRootCauses(String) for more detail

我不能在不降低质量的情况下降低分辨率,即使我将分辨率设置得足够低以显示设备上的所有图像,也不能保证内存更低的其他设备也显示所有图像。

我无法在我自己的设备或任何模拟器上重现此行为(即使将模拟器的 RAM 设置为最小 128MB)。是否可以在转到下一个活动时卸载当前活动的图像以释放一些内存?

编辑:

模拟器上的内存从启动时的 40 MB 增加到加载所有图像后的 220 MB。图像是 200x200 像素的 JPG 文件。

以下 xml 布局的预览:

在此处输入图像描述

这是带有 8 个 ImageView 的活动的 xml 布局:

<TextView
android:id="@+id/tv_main5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:paddingTop="10dp"
android:paddingEnd="10dp"
 />

<LinearLayout

android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:text="@string/step5"
    android:textSize="20sp"
    />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:gravity="center"

    >

    <LinearLayout
        android:id="@+id/dreieck_wild"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:orientation="vertical"
        android:paddingStart="10dp"
        android:paddingLeft="10dp"
        android:paddingEnd="10dp"
        android:paddingRight="10dp">

        <ImageView
            android:id="@+id/ic_p1"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"

          />

        <RadioButton
            android:id="@+id/rb11"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/dreieck_wild" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/langloch"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p2"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
  />
        <RadioButton
            android:id="@+id/rb22"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/langloch"/>
    </LinearLayout>
    <LinearLayout

        android:id="@+id/quadrat"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p3"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            />
        <RadioButton
            android:id="@+id/rb33"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/quadrat"/>
    </LinearLayout>



</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:gravity="center"

    >

    <LinearLayout
        android:id="@+id/raute_versetzt"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"

        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p4"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
   />
        <RadioButton
            android:id="@+id/rb44"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/raute_versetzt"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/raute"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p5"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
    />
        <RadioButton
            android:id="@+id/rb55"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/raute"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/rundloch_klein"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p6"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
        />
        <RadioButton
            android:id="@+id/rb66"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/rundloch_klein"/>
    </LinearLayout>



</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal"
    android:gravity="center"

    >


    <LinearLayout
        android:id="@+id/rundloch_wild"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p7"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
  />
        <RadioButton
            android:id="@+id/rb77"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/rundloch_wild"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/schachbrett"
        android:layout_width="120dp"
        android:layout_height="142dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/ic_p8"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/imageview_height"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
          />
        <RadioButton
            android:id="@+id/rb88"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="false"
            android:text="@string/schachbrett"/>
    </LinearLayout>


</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical"

    >

    <Button
        android:id="@+id/next5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"

        android:enabled="false"
        android:text="@string/next"

        />
</LinearLayout>

标签: androidandroid-glide

解决方案


离开活动时删除所有图像,然后在返回活动时重新添加所有图像,可以使内存足够低以在大多数设备上工作。

在每个活动中:

@override
protected void onStart() {
    Glide.with(this).load(R.drawable.img).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).dontTransform().into(imageView);
    super.onStart();
}

@override
protected void onStop() {
    Glide.with(this).clear(imageView);
    super.onStop();
}

为不同的屏幕分辨率提供图像有助于尽可能降低内存使用量。我使用NativeScript Image Builder来创建我的所有资产。


推荐阅读