Volley加载网络图片

QuibblerQuibbler 2021-03-01 约 10 分钟 1856 次阅读

Volley加载网络图片

通过前面几篇关于Volley的博客,对Volley框架算是比较熟悉了。Volley虽然小巧,应对Android开发中常见的图片加载也是丝毫不逊于专门的图片加载框架(不能显示动态GIF、不支持生命周期管理、不能动态监听网络状态 ... ...)。

Volley图片加载三兄弟:ImageRequest、ImageLoader、NetworkImageView。

1、ImageRequest

在Volley使用介绍一文4.3节中介绍过图片加载请求的简单用法,使用ImageRequest请求网络图片。

先构造ImageRequest网络图片加载请求实例:

val url: String = "http://quibbler.cn/***/10.png"
    val imageRequest: ImageRequest = ImageRequest(url,
            {
                //Bitmap
                imageView.setImageBitmap(it)
            },
            200, 200,
            ImageView.ScaleType.FIT_CENTER,
            Bitmap.Config.ALPHA_8,
            {
                Log.d(TAG, it?.message.toString())
            })

对构造的图片加载请求对象进行一些设置:是否开启缓存、设置TAG等等。

imageRequest.setShouldCache(true).setTag(TAG)
    imageRequest.setTag("QUIBBLER")
    imageRequest.setShouldRetryServerErrors(true)

最后将图片加载Request放入到Volley的RequestQueue队列中处理。

Volley.newRequestQueue(this).add(imageRequest)

会根据ImageRequest的设置情况,从本地缓存加载图片,亦或者直接从网络加载图片。详见Volley请求队列RequestQueue第3节。

2、ImageLoader

只会用第一种ImageRequest就太低效了,Volley在网络图片加载做的远不止这些。内置ImageLoader图片加载器,实现缓存、过滤重复网络加载请求等。

2.1、构造ImageLoader

先创建RequestQueue请求队列实例,推荐使用单例,参考Volley使用介绍一文第5节。

val requestQueue: RequestQueue = Volley.newRequestQueue(this)

在创建ImageLoader中的ImageCache接口实例,这里用LruCache实现内部缓存。关于LruCache见LruCache缓存一文,Android技术之路一步一步稳扎稳打,之前学的现在都会用上。

val imageCache: ImageLoader.ImageCache = object : ImageLoader.ImageCache {
    
        val cache = object : LruCache<String, Bitmap>(10 * 1024 * 1024) {
            override fun sizeOf(key: String?, value: Bitmap?): Int {
                return value?.allocationByteCount ?: 0
            }
        }
        
        override fun getBitmap(url: String): Bitmap? {
            return cache.get(url)
        }
        
        override fun putBitmap(url: String, bitmap: Bitmap) {
            cache.put(url, bitmap)
        }
    }

构造好RequestQueue和ImageCache,就可以创建一个ImageLoader对象:

val imageLoader = ImageLoader(requestQueue, imageCache)

2.2、使用ImageLoader加载网络图片

首先需要先获取ImageListener接口实例用来监听网络图片加载回调,通过ImageLoder类提供的getImageListener(...)静态方法获取

val imageListener:ImageListener = ImageLoader.getImageListener(imageView, 
                                                      R.drawable.defaultImageResId, 
                                                      R.drawable.errorImageResId)

使用ImageLoader加载图片,get(String requestUrl,ImageListener listener)方法传入Url链接和封装了ImageView的ImageListener回调监听器对象。

imageLoader.get(url, imageListener)

使用ImageLoader加载图片显示如果出现闪动,可以使用setBatchedResponseDelay(int newBatchedResponseDelayMs)方法设置等待时间为0来禁用批处理。

/**
     * Sets the amount of time to wait after the first response arrives before delivering all
     * responses. Batching can be disabled entirely by passing in 0.
     *
     * @param newBatchedResponseDelayMs The time in milliseconds to wait.
     */
    public void setBatchedResponseDelay(int newBatchedResponseDelayMs) {
        mBatchResponseDelayMs = newBatchedResponseDelayMs;
    }

3、NetworkImageView

NetworkImageView继承自ImageView,通过一层封装让普通的ImageView拥有加载网络图片的“本领”,并且由于是继承自ImageView,将本地View大小和网络图片进行对比,取最佳进行压缩处理,且压缩过程是在内部自动进行,开发者无需关心实现细节。内部还借助ImageLoader实现,源码后续有空解读一下。

3.1、布局中使用NetworkImageView

在xml布局中使用NetworkImageView,和使用ImageView一样。

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/network_image" />

3.2、设置加载图片

代码中获取绑定布局中对应的实例,

networkImageView = findViewById(R.id.network_image)

通过setImageUrl(String url, ImageLoader imageLoader)方法设置网络加载图片的地址和处理网络加载的ImageLoader。

networkImageView.setImageUrl(url, VolleyInstance.getImageLoader())

上面的方法调用完之后就开始了网络图片加载,看到这里觉得可以更加完善一些,可以自定义style属性app:url,直接在xml布局中设置ImageView的网络图片地址。比如:

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/network_image" 
        app:url="www.baidu.com/***.png"/>

自定义属性参考declare-styleable自定义View属性一文。

相关推荐

Airbnb开源项目
精选开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

2.3k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175
sherpa解析:开源语音技术全家桶
精选开源

sherpa解析:开源语音技术全家桶

想在手机、树莓派甚至 RISC-V 开发板上离线跑语音识别,五年前还是个需要啃 Kaldi 源码的硬核课题。k2-fsa 组织的 sherpa 把这件事变成了"下载预训练模型、装个包、跑示例"的三步操作。这个以 Apache-2.0 协议开源的项目自我定位是"新一代 Kaldi 的语音转文本框架",它专注端到端模型的推理部署:transducer 与 CTC 两类架构,C++ 与 Python 双…

44