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

问题描述 投票:48回答:1

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

android performance android-glide
1个回答
197
投票

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

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

想象一下动态添加到Activity的Fragment。在它的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),但是当它不是,如在适配器或集中式图像加载方法中,传入RequestManager 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));
© www.soinside.com 2019 - 2024. All rights reserved.