我在我的 android 应用程序中使用 glide 进行图像加载,以避免任何崩溃,我正在使用应用程序上下文加载图像。这会对应用程序和内存的性能产生什么影响?
问问题
57896 次
1 回答
284
这会对应用程序和内存的性能产生什么影响?
Glide 提供这么多.with()
方法是有原因的:它遵循生命周期。
想象一个Fragment
动态添加到 Activity 中。在它的onCreateView
方法中,它启动了一个 3MB 图像的 Glide 加载。现在,如果用户按下后退按钮并且 Fragment 被移除或整个活动被关闭怎么办?
- 如果你使用
with(getActivity().getApplicationContext())
什么都不会发生,所有 3MB 的数据都会被下载,然后解码、缓存,甚至可能设置到 ImageView,然后被垃圾收集,因为对它的唯一引用来自 Glide 内部。 - 如果您使用
with((Fragment)this)
Glide 订阅 Fragment 的生命周期事件,并且一旦 Fragment 停止,任何未完成的请求都应该暂停;当被销毁时,所有待处理的请求都会被清除。这意味着图像下载将中途停止,该死片段将不再使用任何资源。 - 如果您使用
with(getActivity())
Glide 订阅 Activity 的生命周期事件,并且发生与上述相同的事情,但仅在 Activity 停止或销毁时发生。
所以最好的做法是使用最接近的上下文/片段来避免未使用的请求完成!(还有一种手动停止负载的方法:Glide.clear(ImageView|Target)
。)
要在实践中应用这一点,请尽可能尝试使用with(this)
,但如果不是,例如在适配器或集中式图像加载方法中,请传入 aRequestManager glide
作为参数并使用glide.load(...
,例如:
static loadImage(RequestManager glide, String url, ImageView view) {
glide.load(url).into(view);
}
或在适配器中:
class MyAdapter extends WhichEveryOneYouUse {
private final RequestManager glide;
MyAdapter(RequestManager glide, ...) {
this.glide = glide;
...
}
void getView/onBindViewHolder(... int position) {
// ... holder magic, and get current item for position
glide.load... or even loadImage(glide, item.url, holder.image);
}
}
并从 Activity/Fragment 使用这些:
loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));
于 2015-10-01T12:32:03.947 回答