我在使用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具有生命周期意识,但是是的,我知道它可能仅适用于加载请求。 所以我在考虑可能的解决方案:
从这里走什么路?
此外,我现在还完全错失了什么。这是转换代码:
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) {}
};
}
此外,我仍在尝试找出如何在转换代码中引用活动。
答案 0 :(得分:0)
我最终没有使用Glide变换,而是在onCustomTarget
中从可滑动获取可绘制对象之后手动对其进行了变换。