Glide Transformation内存泄漏

问题描述 投票:0回答:1

我在使用Glide的过程中遇到了这个内存泄漏的问题。这是LeakCanary的跟踪。

 D/LeakCanary: ├─ android.provider.FontsContract
 D/LeakCanary: │    Leaking: NO (HomeApplication↓ is not leaking and a class is never leaking)
 D/LeakCanary: │    GC Root: System class
 D/LeakCanary: │    ↓ static FontsContract.sContext
 D/LeakCanary: ├─  <package>.HomeApplication
 D/LeakCanary: │    Leaking: NO (Application is a singleton)
 D/LeakCanary: │    HomeApplication does not wrap an activity context
 D/LeakCanary: │    ↓ HomeApplication.mComponentCallbacks
 D/LeakCanary: │                      ~~~~~~~~~~~~~~~~~~~
 D/LeakCanary: ├─ java.util.ArrayList
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ ArrayList.elementData
 D/LeakCanary: │                ~~~~~~~~~~~
 D/LeakCanary: ├─ java.lang.Object[]
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ array Object[].[1]
 D/LeakCanary: │                     ~~~
 D/LeakCanary: ├─ com.bumptech.glide.Glide
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ Glide.memoryCache
 D/LeakCanary: │            ~~~~~~~~~~~
 D/LeakCanary: ├─ com.bumptech.glide.load.engine.cache.LruResourceCache
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ LruResourceCache.cache
 D/LeakCanary: │                       ~~~~~
 D/LeakCanary: ├─ java.util.LinkedHashMap
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ LinkedHashMap.tail
 D/LeakCanary: │                    ~~~~
 D/LeakCanary: ├─ java.util.LinkedHashMap$LinkedHashMapEntry
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ LinkedHashMap$LinkedHashMapEntry.key
 D/LeakCanary: │                                       ~~~
 D/LeakCanary: ├─ com.bumptech.glide.load.engine.EngineKey
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ EngineKey.transformations
 D/LeakCanary: │                ~~~~~~~~~~~~~~~
 D/LeakCanary: ├─ com.bumptech.glide.util.CachedHashCodeArrayMap
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ CachedHashCodeArrayMap.mArray
 D/LeakCanary: │                             ~~~~~~
 D/LeakCanary: ├─ java.lang.Object[]
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ array Object[].[1]
 D/LeakCanary: │                     ~~~
 D/LeakCanary: ├─ <package>.<some class>$3
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    Anonymous class implementing com.bumptech.glide.load.Transformation
 D/LeakCanary: │    ↓ <some class>$3.this$0
 D/LeakCanary: │                ~~~~~~
 D/LeakCanary: ├─ <package>.<some class>
 D/LeakCanary: │    Leaking: UNKNOWN
 D/LeakCanary: │    ↓ <some class>.activity
 D/LeakCanary: │              ~~~~~~~~
 D/LeakCanary: ╰→ <package>.<some activity>
 D/LeakCanary: ​     Leaking: YES (Activity#mDestroyed is true and ObjectWatcher was watching this)
 D/LeakCanary: ​     key = 632286af-8d9e-4b05-bc8f-5974ca16931b
 D/LeakCanary: ​     watchDurationMillis = 2957886
 D/LeakCanary: ​     retainedDurationMillis = 2952885

所以,这是说转型被glide缓存了,而且转型引用了activity.我的印象中,glide是有生命周期意识的,但是,是的,我明白,它可能只适用于加载请求.所以我在想我有的可能的解决方案。

  1. 不要在转换代码中引用活动
  2. 清除glide的状态,使其清除缓存中的变换。
  3. 要求glide不缓存变换。

从这里开始有什么办法?

另外,我现在是不是有什么完全错误的地方没有做到。这是变换的代码。

new Transformation<Drawable>() {
      @NonNull
      @Override
      public Resource<Drawable> transform(
          @NonNull Context context,
          @NonNull Resource<Drawable> resource,
          int outWidth,
          int outHeight) {
        Drawable albumArt = resource.get();
        int backgroundColor;
        if (albumArt instanceof BitmapDrawable) {
          backgroundColor =
              <some util class>.getBackgroundColorForBitmap(
                  ((BitmapDrawable) albumArt).getBitmap());

        } else {
          backgroundColor = defaultBackgroundScrimColor;
        }
        Drawable[] layers = {
          albumArt, <some util class>.getGradientOverlay(backgroundColor)
        };
        return new SimpleResource<>(new LayerDrawable(layers));
      }

      @Override
      public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {}
    };
  }

另外,我还在努力寻找如何在转换代码中引用活动。

android android-glide
1个回答
0
投票

我最后没有使用Glide变换,而是手动变换了可绘制的内容后,我在 onCustomTarget 从滑行。

© www.soinside.com 2019 - 2024. All rights reserved.