Glide 没有加载所有图片(本地文件)(OutOfMemory)

Glide does not load all images (local files) (OutOfMemory)

Glide 版本 4.9.0

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

前 3 个活动有一个大 ImageView

Activity四小五小ImageViews.

Activity五小8个ImageViews.

_

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

在我使用Glide之前,我只是在我的xml文件中使用了ImageViewandroid:src属性, 当用户尝试打开 Activity Four with the 5 ImageViews:

时,这会导致 Galaxy S6 设备出现以下错误

java.lang.OutOfMemoryError: Failed to allocate a 10240012 byte allocation with 6982184 free bytes and 6MB until OOM

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

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

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

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

现在 前 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 也无法重现)。 是否可以在转到下一张时卸载当前activity的图像以释放一些内存?

编辑:

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

以下xml布局的预览:

这是具有 8 个 ImageView 的 activity 的 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>

尝试像这样更改 Glide 代码:

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

此外,如果您的图像没有动态变化(意味着是否有任何图像正在动态加载并且不会动态更改),则添加行:

.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)

.diskCacheStrategy(DiskCacheStrategy.NONE)

在离开 activity 时删除所有图像,然后在返回 Activity 时删除所有图像 re-adding 保持低内存足以在大多数设备上工作。

每个Activity:

@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 创建了我所有的资产。