Volley加载网络图片

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

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

1.8k
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.2k
优美的开源动效库:Lottie
开源

优美的开源动效库:Lottie

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

4.3k