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

图像总数不是固定的。


当前回答

URLImageViewHelper是一个非常棒的库,可以帮助您做到这一点。

其他回答

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

通用图像加载器

特征

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

Android 2.0+支持

另一种方法是通过getView()方法中线程中的适配器:

Thread pics_thread = new Thread(new Runnable() {
    @Override
    public void run() {
        Bitmap bitmap = getPicture(url);
        if(bitmap != null) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    holder.imageview.setImageBitmap(bitmap);            
                    adapter.notifyDataSetChanged();
                }                       
            });             
        }       
    }                       
});

pics_thread.start();

当然,您应该始终缓存图像以避免额外的操作,您可以将图像放在HashMap数组中,检查图像是否存在于数组中,如果不存在,则继续执行线程或从HashMap数组加载图像。此外,请始终检查内存是否泄漏,位图和可绘制文件通常占用大量内存。优化代码取决于您。

您可以尝试使用Aquery Android库来延迟加载图像和列表视图。。。以下代码可能会帮助您。。。。。从这里下载库。

AQuery aq = new AQuery(mContext);
aq.id(R.id.image1).image("http://data.whicdn.com/images/63995806/original.jpg");

更新:如果您正在寻找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迁移

此处提供完整文档

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

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