android - FragmentStatePagerAdapter 正在泄漏,我不知道为什么在使用 LeakCanary 时
问题描述
我正在使用 LeakCanary 来帮助检测泄漏,并且我不断得到这个泄漏,但我无法弄清楚它为什么会发生。
我有一个 FragmentStatePagerAdapter,它使用其默认的屏幕外限制,即每侧加载一个。
我在 Fragment 中所拥有的只是使用 Glide 加载图像。
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_viewpager_image_view, container, false);
ButterKnife.bind(this, view);
Glide.with(mContext).load(mUrl)
.apply(RequestOptions.centerInsideTransform())
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
mProgressBar.setVisibility(View.INVISIBLE);
errorImageView.setVisibility(View.VISIBLE);
errorTextView.setVisibility(View.VISIBLE);
Glide.with(mContext)
.load(R.drawable.snail)
.apply(RequestOptions.centerInsideTransform())
.into(errorImageView);
String text = "Failed to load image \n" + mUrl;
errorTextView.setText(text);
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
mProgressBar.setVisibility(View.INVISIBLE);
return false;
}
})
.into(mImage);
return view;
}
每次滚动时都不会弹出 LeakCanary 消息,所以这很令人沮丧,因为我无法确定如何重新创建错误。我可以在 LeakCanary 消息弹出之前滚动并加载 30-50 张图像。
├─ e.com.app.ui.viewpager.ViewpagerImageFragment$1 instance
│ Leaking: UNKNOWN
│ Anonymous class implementing com.bumptech.glide.request.RequestListener
│ ↓ ViewpagerImageFragment$1.this$0
│ ~~~~~~
╰→ e.com.app.ui.viewpager.ViewpagerImageFragment instance
Leaking: YES (ObjectWatcher was watching this because e.com.app.ui.viewpager.ViewpagerImageFragment received Fragment#onDestroy() callback and Fragment#mFragmentManager is null)
key = 3e232914-78d0-457c-9ca5-c6e9c8f92c55
watchDurationMillis = 7300
retainedDurationMillis = 2300
key = f745901e-5222-42db-b594-f07a47b84788
究竟是什么导致了泄漏?
解决方案
使用Glide.with(this)
,this
Fragment 实例在哪里,您的 Glide 请求将与您的 Fragment 生命周期而不是 Activity 相关联。
推荐阅读
- python - 如何将此字节码解码为常规的 .py 脚本?
- ionic-framework - 有没有办法读取 Ion-Segment 值以将它们传递给 Ion-Fab 以根据 SwitchCase 运行不同的功能?
- javascript - 我试图在滚动上产生视差效果,但让项目以相反的方式移动
- django - Django 无法登录(登录视图在登录时不返回 sessionid 的 set-cookie 标头)
- android-management-api - Android 设备政策迁移
- typescript - ESLint - 为 TypeScript 配置“no-unused-vars”
- python - 如何在 Visual Studio 中为不属于解决方案的 Python 文件管理 Python 搜索路径或引用?
- amazon-redshift - 从多行获取总计
- java - 如何将用户凭据从 zuul 发送到 Spring Boot 微服务中的微服务模块
- php - mysql代码中使用from_unixtime转换时间戳的问题