当前位置: 首页 > 知识库问答 >
问题:

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

闾丘成礼
2023-03-14

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

共有2个答案

璩涛
2023-03-14
匿名用户

private fun RequestManager.syncWithLifecycleOwner(view: View): RequestManager {

val syncRequest = object : DefaultLifecycleObserver {
    override fun onStart(owner: LifecycleOwner) = onStart()
    override fun onStop(owner: LifecycleOwner) = onStop()
    override fun onDestroy(owner: LifecycleOwner) {
        onDestroy()
        owner.lifecycle.removeObserver(this)
    }
}

view.findViewTreeLifecycleOwner()?.lifecycle?.addObserver(syncRequest)

return this

}

然后,您可以制作一个简单的扩展函数,如下所示:

fun ImageView.loadUrl(url: String) {
   Glide
      .with(context.applicationContext)
      .syncWithLifecycleOwner(this)
      .load(url)
      .into(this) 
}

AndroidX生命周期库中存在findViewTreeLifecycleOwner()。它提供了该特定ImageView所附加的活动或片段视图的生命周期(viewLifecycleOwner)。您需要从视图中传入应用程序上下文,以确保Glide libs不会调用回调本身。

金何平
2023-03-14

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

Glide提供了很多<代码>。with()方法有一个原因:它遵循生命周期。

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

  • 如果将与(getActivity()一起使用。getApplicationContext())什么都不会发生,所有3MB的数据都会被下载,然后解码、缓存,甚至可能设置为ImageView,然后对其进行垃圾收集,因为对它的唯一引用来自Glide内部
  • 如果使用((Fragment)this)Glide订阅片段的生命周期事件,并且一旦片段停止,任何未完成的请求都应该暂停;销毁后,所有未决html" target="_blank">请求都将被清除。这意味着图像下载将中途停止,该死片段将不再使用更多资源
  • 如果将与(getActivity())一起使用,则Glide订阅活动的生命周期事件,并且发生与上述相同的事情,但仅当活动停止或销毁时

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

若要在实践中应用此方法,请尽可能将与(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);
    }
}

并从活动/片段中使用这些:

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

 类似资料:
  • 我正在处理一个Spring Boot应用程序,其中我使用该应用程序公开SOAP WebService。我在Spring boot应用程序中使用Apache CFX framework for SOAP impl。我正在使用基于注释的方法。 我在一个bean中的Spring Boot配置文件中设置应用程序上下文时遇到了问题。下面是我的代码。 配置文件如下所示。 现在我有了bean SOAPproce

  • 问题内容: 我们正在尝试将 图像预加载 到缓存中,以便稍后加载(图像位于应用程序的 Asset文件夹 中) 我们尝试了什么: 问题:仅当我们尝试加载/显示图像时才对它们进行缓存:必须先将它们加载到内存中,这样它们才能更快地显示出来。 我们还尝试使用GlideModule来增加CacheMemory的大小: 在清单中: 到目前为止没有任何工作。任何想法? 我们尝试使用不可见的1 dp imageVi

  • 我正在使用Glide库在imageview中加载图像,并使用以下代码。 灰色占位符在图像未加载之前可见,但在图像在imageview中加载后,占位符仍会出现,并在该图像后显示一些空白。 我如何解决这个问题。如果你有任何想法,请帮助我。

  • 我是spring的新手,我想知道是否可以只通过注释必须注入变量的类来加载应用程序(而不是使用ApplicationContext ctx=new ApplicationContext(“MyAppContext”))。 我举以下例子: 我有一个类,其中一个字符串应该是自动连线的 spring bean配置文件(testSpringContext.xml)如下所示 现在,我想使用中的以下代码显示自动

  • 我有一个相当简单的设置。一个包含3个模块的maven项目:core/webapp/model。我正在使用Spring boot来升级我的应用程序。在webapp中,我有一个简单的类WebappConfig如下: 当我部署abcd.war时,applicationcontext加载了两次,并导致以下错误stracktrace: 不存在我前面提到的web.xml。 一些有趣的事情,我不知道为什么: n

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean