使用应用程序上下文滑动图像加载


72

我正在使用glide在我的android应用程序中加载图像,以避免在使用应用程序上下文加载图像时发生任何崩溃。这将对应用程序和内存的性能产生什么影响?

Answers:


255

这将对应用程序和内存的性能产生什么影响?

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));

14
很棒的解释!这为我节省了大量时间来调查经常发生OOM异常的主要原因。谢谢!
user1774316 2015年

2
注意:调用Glide.with(view.getContext())实际上等效Glide.with(this)于对该活动出现的任何视图,因为RequestManagerRetriever.get(Context context)检查上下文是否为instanceofActivity并适当地对其进行了强制转换,例如get((Activity)context)。因此,get(Activity)无论哪种方式,最终都将使用相同的方法。
Lorne Laliberte'6

1
因此,我们不需要手动调用Glide.with(this).onDestroy()?假设我们使用正确的Context与我们的Glide.with()..电话,因为Glide将钩到活动/片段的生命周期?
Sakiboy '17

2
直到Glide开发人员修复了“您无法为破坏的活动开始加载”
引发

2
@Nurseyit线圈的作者在这里。与Glide类似,如果您load在Fragment的内部开始,Coil将使用Activity的生命周期。但是,Coil和Glide都将响应View.onDetach事件,这些事件是在将Fragment移至Backstack时触发的。另外,由于Coil使用AndroidX生命周期组件,因此在被销毁的Activity中发出的任何请求都将立即被取消。
Colin White
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.