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属性一文。
