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

Har*_*Ram 58 performance android android-glide

我在我的Android应用程序中使用滑动来加载图像,以避免任何崩溃我正在使用应用程序上下文加载图像.这会对应用程序和内存的性能产生什么影响?

TWi*_*Rob 215

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

Glide提供了许多.with()方法,原因如下:它遵循生命周期.

想象一下Fragment,动态添加到Activity.在它的onCreateView方法中,它启动3MB图像的Glide加载.现在,如果用户按下后退按钮并删除片段或整个活动已关闭,该怎么办?

  • 如果你with(getActivity().getApplicationContext())没有使用任何东西,那么所有3MB的数据都会被下载然后被解码,缓存,甚至可能被设置为ImageView,然后被垃圾收集,因为它的唯一引用来自Glide内部.
  • 如果您使用with((Fragment)this)Glide订阅Fragment的生命周期事件,并且一旦Fragment停止,则应暂停任何未完成的请求; 当销毁时,所有待处理的请求都将被清除.这意味着图像下载将在中途停止,并且该死片段将不再使用更多资源.
  • 如果您使用with(getActivity())Glide订阅Activity的生命周期事件,则会发生与上述相同的事情,但仅限于Activity停止或销毁时.

因此,最佳做法是使用最接近的可能上下文/片段来避免未使用的请求完成!(还有一种手动方式来阻止负载:Glide.clear(ImageView|Target).)


要在实践中应用它,请尝试尽可能使用with(this),但如果不是,如在适配器或集中式图像加载方法中,则传入a RequestManager glide作为参数并使用glide.load(...,例如:

static loadImage(RequestManager glide, String url, ImageView view) {
    glide.load(url).into(view);
}
Run Code Online (Sandbox Code Playgroud)

或适配器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用Activity/Fragment中的这些:

loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解释!它为我节省了大量时间来研究经常出现OOM异常的主要原因.谢谢! (11认同)
  • 注意:对于出现在该活动上的任何视图,调用`Glide.with(view.getContext())`实际上等效于`Glide.with(this)`,因为`RequestManagerRetriever.get(Context context)`检查上下文是否为一个`Activity`的实例并适当地转换它,例如`get((Activity)context)`.因此,无论哪种方式,最终都会使用相同的`get(Activity)`方法. (2认同)
  • 直到Glide开发人员修复了“您无法为已破坏的活动启动加载”引发异常,建议您使用ApplicationContext (2认同)
  • @Nurseyit 《线圈》的作者在这里。与 Glide 类似,如果您在 Fragment 内启动“load”,Coil 将使用 Activity 的生命周期。然而,Coil 和 Glide 都会响应 View.onDetach 事件,这些事件在 Fragment 移动到后台堆栈时触发。此外,由于 Coil 使用 AndroidX 生命周期组件,因此在已销毁的 Activity 内发出的任何请求都将立即取消。 (2认同)