我正在使用glide在我的android应用程序中加载图像,以避免在使用应用程序上下文加载图像时发生任何崩溃。这将对应用程序和内存的性能产生什么影响?
Answers:
这将对应用程序和内存的性能产生什么影响?
Glide提供了这么多.with()
方法是有原因的:它遵循生命周期。
想象一下Fragment
,它是动态添加到活动中的。在其onCreateView
方法中,它将启动3MB图像的Glide加载。现在,如果用户按下“后退”按钮并且“片段”被删除或整个活动被关闭,该怎么办?
with(getActivity().getApplicationContext())
什么也不用,那么将下载所有3MB的数据,然后对其进行解码,缓存,甚至可能设置为ImageView,然后再对其进行垃圾回收,因为对它的唯一引用是来自Glide内部。with((Fragment)this)
Glide订阅Fragment的生命周期事件,并且一旦Fragment停止,则任何未完成的请求都应该暂停;销毁后,所有待处理的请求都会被清除。这意味着映像下载将中途停止,并且该死片段将不再使用任何资源。with(getActivity())
Glide,则订阅活动的生命周期事件,并且与上述相同,但仅在活动停止或销毁时发生。因此,最佳实践是使用最接近的上下文/片段以避免未完成的请求完成!(还有一种手动方式来停止负载: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);
}
}
并使用“活动/片段”中的这些:
loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));
Glide.with(view.getContext())
实际上等效Glide.with(this)
于对该活动出现的任何视图,因为RequestManagerRetriever.get(Context context)
检查上下文是否为instanceofActivity
并适当地对其进行了强制转换,例如get((Activity)context)
。因此,get(Activity)
无论哪种方式,最终都将使用相同的方法。
Glide.with(this).onDestroy()
?假设我们使用正确的Context
与我们的Glide.with()..
电话,因为Glide
将钩到活动/片段的生命周期?
load
在Fragment的内部开始,Coil将使用Activity的生命周期。但是,Coil和Glide都将响应View.onDetach
事件,这些事件是在将Fragment移至Backstack时触发的。另外,由于Coil使用AndroidX生命周期组件,因此在被销毁的Activity中发出的任何请求都将立即被取消。