83

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

4

1 回答 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 回答