我正在使用ListView来显示与这些图像相关的一些图像和标题。我正在从互联网上获取图像。是否有一种方法可以延迟加载图像,以便在文本显示时,UI不会被阻止,图像在下载时显示?

图像总数不是固定的。


当前回答

更新:如果您正在寻找2020年由Kotlin Coroutines支持的解决方案,请尝试Coil。

Coil是Coroutine Image Loader的缩写。

特征

快速:Coil执行许多优化,包括内存和磁盘缓存、在内存中对图像进行下采样、重新使用位图、自动暂停/取消请求等。轻量级:Coil为您的APK添加了约2000个方法(适用于已经使用OkHttp和Coroutines的应用程序),这与毕加索不相上下,明显少于Glide和Fresco。易于使用:Coil的API利用了Kotlin的语言特性,以实现简单和最小的样板。现代:Coil首先是Kotlin,它使用了包括Coroutines、OkHttp、Okio和AndroidX Lifecycles在内的现代库。

渐变设置:

线圈在mavenCentral()上可用。

implementation("io.coil-kt:coil:1.0.0")

快速入门

要将图像加载到ImageView中,请使用加载扩展函数:

// URL
imageView.load("https://www.example.com/image.jpg")

// Resource
imageView.load(R.drawable.image)

// File
imageView.load(File("/path/to/image.jpg"))

或在后台线程上

// Coil (suspends the current coroutine; non-blocking and thread safe)
val request = ImageRequest.Builder(context)
    .data(url)
    .size(width, height)
    .build()
val drawable = context.imageLoader.execute(request).drawable

您也可以从Picasso/Glide迁移

此处提供完整文档

其他回答

看看Shutterbug,Applidium的轻量级SDWebImage(iOS上的一个不错的库)到Android的端口。它支持异步缓存,存储失败的URL,很好地处理并发,并包含有用的子类。

也欢迎拉取请求(和错误报告)!

除了异步加载数据缓存外,您可能需要UI缓存,如setViewCacheSize

除了加载可见项数据外,您可能需要加载近似的可见项数据

AndroidX分页库是另一个选项,例如,您可以从SQLite数据库加载、缓存和显示10000000个项目到RecyclerView。参考PagedList

例子:假设列表视图可见项为[6,7,8,9,10],您可能需要加载[6,7,8,10]并预加载项[1,2,3,4,5]和[11,12,13,14,15],因为用户可能会滚动到前页或后页

我用图像制作了一个懒惰列表(位于GitHub)的简单演示。

基本用途ImageLoader ImageLoader=新的ImageLoader(上下文)。。。imageLoader.DisplayImage(url,imageView);不要忘记添加对AndroidManifest.xml的以下权限:<uses permission android:name=“android.ppermission.INTERNET”/><uses permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>请只创建ImageLoader的一个实例,并在您的应用这样,图像缓存将更加高效。

这可能对某人有帮助。它在后台线程中下载图像。图像缓存在SD卡和内存中。缓存的实现非常简单,对于演示来说就足够了。我使用inSampleSize解码图像以减少内存消耗。我还尝试正确处理回收的视图。

你必须试试这个通用加载器。我在做了很多关于延迟加载的RnD之后使用了这个。

通用图像加载器

特征

多线程图像加载(异步或同步)ImageLoader配置的广泛定制(线程执行器、下载器、解码器、内存和磁盘缓存、显示图像选项等)每个显示图像调用都有许多自定义选项(存根图像、缓存开关、解码选项、位图处理和显示等)内存和/或磁盘上的图像缓存(设备的文件系统或SD卡)收听加载过程(包括下载进度)

Android 2.0+支持

您可以使用一些第三方库(如Piccaso或Volley)进行有效的延迟加载。您还可以通过实现以下内容创建自己的

用于从url下载图像的实现代码实现用于存储和检索图像的缓存机制(使用android的LruCache进行缓存)