我在使用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是有生命周期意识的,但是,是的,我明白,它可能只适用于加载请求.所以我在想我有的可能的解决方案。
从这里开始有什么办法?
另外,我现在是不是有什么完全错误的地方没有做到。这是变换的代码。
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) {}
};
}
另外,我还在努力寻找如何在转换代码中引用活动。
我最后没有使用Glide变换,而是手动变换了可绘制的内容后,我在 onCustomTarget
从滑行。