Android中关于Volley的使用(四)利用NetworkImageView来加载图片

基于ImageLoader的 NetworkImageView 基于ImageLoader,用于异步加载图片的视图 可以加载本地图片和网络图片 立即下载

在使用Volley来从网络获取图片的时候,我们前面介绍了ImageRequest的使用,而其实Volley还提供了一个NetworkImageView类。利用这个类,我们可以更有效率地去从网络去获取图片,因为它里面帮我们多设置了一个缓存,帮我们自己去处理请求的队列。

NetworkImageView类的具体使用方式如下:

1)在XML中定义:

    <FrameLayout
        android:id="@+id/flImageContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/gvImages"
        android:layout_margin="30dp" >

        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/nivTestView"
            android:layout_width="100dp"
            android:layout_height="100dp" >
        </com.android.volley.toolbox.NetworkImageView>
    </FrameLayout>

就相当于使用自定义的View,这里是com.android.volley.toolbox.NetworkImageView。

2)然后在Activity中使用:

		networkImageView = (NetworkImageView) findViewById(R.id.nivTestView);
		
		mQueue = Volley.newRequestQueue(this);
		
		LruImageCache lruImageCache = LruImageCache.instance();
		
		ImageLoader imageLoader = new ImageLoader(mQueue,lruImageCache);
				
		networkImageView.setDefaultImageResId(R.drawable.ic_launcher);
		networkImageView.setErrorImageResId(R.drawable.ic_launcher);		
		networkImageView.setImageUrl(URLS[1], imageLoader);

第一步:我们还要创建一个RequestQueue。

第二步:我们要创建一个ImageLoader。

ImageLoader是NetworkImageView类中真正去跟网络打交道,获取图片的类,而在它的构造函数中,我们发现还需要去实现一个ImageCache接口的类,即上面的LruImageCache类,这是作为ImageLoader的内存缓存类,也就是通常所说的一级缓存了(L1)。

ImageCache是ImageLoader的内部接口,其定义如下:

    public interface ImageCache {
        public Bitmap getBitmap(String url);
        public void putBitmap(String url, Bitmap bitmap);
    }


所以在利用NetworkImageView之前,我们还需要先去实现这个接口,而Volley推荐的也就是LruCache,代码中的LruImageCache实现如下:

package com.lms.volleydemo;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class LruImageCache implements ImageCache{

	private static LruCache<String, Bitmap> mMemoryCache;
	
	private static LruImageCache lruImageCache;
	
	private LruImageCache(){
		// Get the Max available memory
		int maxMemory = (int) Runtime.getRuntime().maxMemory();
		int cacheSize = maxMemory / 8;
		mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
			@Override
			protected int sizeOf(String key, Bitmap bitmap){
				return bitmap.getRowBytes() * bitmap.getHeight();
			}
		};		
	}
	
	public static LruImageCache instance(){
		if(lruImageCache == null){
			lruImageCache = new LruImageCache();
		}
		return lruImageCache;
	}
	
	@Override
	public Bitmap getBitmap(String arg0) {		
		return mMemoryCache.get(arg0);	
	}

	@Override
	public void putBitmap(String arg0, Bitmap arg1) {
		if(getBitmap(arg0) == null){
			mMemoryCache.put(arg0, arg1);
		}		
	}

}

利用了 LruCache 来作为缓存,然后实现 ImageCache 的 getBitmap 和 putBitmap 方法。

然后将上面创建的 mQueue 和 LruImageCache 作为参数传递给其构造函数,这样 ImageLoader 对象就创建了。

第三步:调用 NetworkImageView 的 setImageUrl 方法,在这里,将 ImageLoader 传给它,然后就可以了。不过 Volley 推荐呢,在设置url之前,可以调用其以下两个方法:

    /**
     * Sets the default image resource ID to be used for this view until the attempt to load it
     * completes.
     */
    public void setDefaultImageResId(int defaultImage) {
        mDefaultImageId = defaultImage;
    }

    /**
     * Sets the error image resource ID to be used for this view in the event that the image
     * requested fails to load.
     */
    public void setErrorImageResId(int errorImage) {
        mErrorImageId = errorImage;
    }

所以,我们在上面调用setImageUrl之前,也调用了这两个方法,其目的有两个:

1)调用 setDefaultImageResId,设置一个默认的图片显示,直到网络上的图片load完为止。

2)调用 setErrorImageResId,设置一个错误的图片,在网络加载过程中出错的时候展示。

下面我们来看看效果图:


上图中6个小图片呢,就是我们第一篇文章中利用ImageRequest来获取的网络图片了,而下面那一张稍大的,则是我们利用NetworkImageView来获取的图片了。

而除了在XML中定义,我们也可以直接在Java中动态创建,然后在Java中设置其url地址,其实我觉得这才是它最主要的用途,应该是用在展示大量网络图片的时候,效果会比较好。

关于利用ImageRequest来加载图片的方法,大家可以参考:
深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘 本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。 阅读详情

相关推荐

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

Android之网络图片加载的5种基本方式

学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助。此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection、HttpClients、Volley、XUtils、OkHttp等网络加载图片。其他网络图片加载方式,...

YZJ_0722的博客 5312

【DRAM存储器四十七】LPDDR5介绍--LPDDR5的低功耗技术之DVFS

讲述LPDDR5的DVFSC和DVFSQ的工作原理和要求

highman110的博客 898

Android ImageView如何加载网络和本地图片资源

package com.android.antking.imageview;      import java.io.InputStream;   import java.net.HttpURLConnection;   import java.net.MalformedURLException;   import java.net.URL;      import android.

susr154的博客 8031

彻底解决JDK安装包点击后无反应

jdk双击无法安装,jdk双击没反应,jdk安装包双击后没反应。

renkai721的专栏 8937

docker部署neo4j,设置密码。Neo.ClientError.Security.Unauthorized: The client is unauthorized due to authenti

卷,设置NEO4J_AUTH将不会起作用,因为该数据库已经配置了身份验证。Neo4j Docker 服务将会启动,但您需要使用已与该数据库关联的用户名和密码才能登录。这里,使用了环境变量NEO4J_AUTH,设置了用户名为neo4j,密码为neo4jneo4j。这个命令还是比较全的,包括设置密码,设置端口,挂载外部的数据目录等。原因嘛,就是使用docker创建的neo4j,登录不上。把👆提到的外挂的数据,都清空了,再重新来一遍。有一种情况下,这样设置密码,并不会成功。如果不出意外,目前就算大功告成了。

xiezhipu的博客 563

android使用ImageView加载本地SdCard图片和加载网络图片

android使用ImageView加载本地SdCard图片和加载网络图片   例子1:android加载自己文件夹的图片,使用R类   main.xml文件     android:orientation="vertical"     android:layout_width="fill_parent"     android:layout_hei

huang9012的专栏 1万+

手把手实现3D肺结节检测:基于Faster R-CNN的从CT处理、训练到部署的五步代码级实战与避坑指南

亲爱的同学,当你能完整实现“3D Faster R-CNN肺部结节检测系统”,你会发现医学影像AI的毕设课题充满挑战与成就感。我们围绕3D Faster R-CNN模型,从数据处理、模型搭建到实验验证,一步步带你打造一个能精准检测肺部结节的智能系统,让你的毕设既体现技术深度,又能为肺部疾病早期诊断贡献实用价值。是专为3D医学影像设计的目标检测模型,能在三维CT数据中自动定位、识别肺部结节——这一课题兼具“临床价值”和“技术挑战性”,是毕设的优质选择,能充分展现你的工程能力和科研敏感度。

LXY_LOVE36的博客 306

Android Volley使用(二)使用Volley加载网络图片

使用Volley加载网络图片

Errol's Blog 2748

【具身智能】感知 × 决策 × 执行:一个智能体的认知闭环怎么搭?

构建一个真正能在现实世界中运作的具身智能体,并不是简单地拼接“视觉 + 控制器 + 动作模块”就能完成的,它必须是一个**认知闭环结构**:能感知环境、理解状态、制定策略、执行动作,并从结果中学习反馈。 本讲将深入剖析具身智能的三大核心支柱:**感知系统、决策系统、执行系统**,并解析它们如何协同构建出一个“能观察、能思考、能行动”的智能体。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3261

Python 爬虫实战:爬取豆瓣电影 Top250 完整数据

本文基于Python技术实现了豆瓣电影Top250榜单数据的合规爬取与分析。针对豆瓣电影页面的分页结构、反爬机制等特点,采用requests库获取数据,结合BeautifulSoup解析HTML节点,并通过正则表达式提取电影名称、评分、导演等核心字段。爬虫实现了随机User-Agent、请求间隔控制等反爬规避策略,严格遵守豆瓣社区使用规范。最终数据经清洗后存储为结构化Excel文件,并提供了数据可视化与增量更新方案。该方案为影视研究提供了可靠的数据获取方法,同时确保符合非商业使用、适度爬取等合规要求。

2503_91057718的博客 3459

Android Volley完全解析(二),使用Volley加载网络图片

在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法。本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完全解析(一),初识Volley的基本用法。 在上篇文章中有提到过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架。我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们也可以实现基

郭霖的专栏 16万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android框架Volley之:利用Imageloader和NetWorkImageView加载图片

Android框架Volley之:利用Imageloader和NetWorkImageView加载图片 首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: <uses-permissio...

极歌科技 320

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android结合volley的netWorkImageview实现图片文件缓存

在写Android应用程序时经常会用到图片缓存,对于网络请求使用Android平台上的网络通信库Volley,能使网络通信更快,更简单,更健壮,而且Volley特别适合数据量不大但是通信频繁的场景,所以可以使用volley来请求网络图片。接下来就将本人在一个项目中的图片缓存模块拿出来跟大家分享,欢迎批评指正。 /** * @author * @date 2015/4/14 * 利用文件

There is nothing 2364

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android Volley框架(二):ImageRequest、ImageLoader、NetworkImageView

Volley加载图片可以通过三种方式:ImageRequest、ImageLoader、NetworkImageView 直接上代码,使用说明见注释: 第一步 搭建环境 下载jar包,新建工程,导入volley.jar 第二步 AndroidManifest.xml 文件 打开网络权限  () 引入MyApplication  (andr

可乐淘的专栏 1194

Android 流行的网络图片加载库 之 使用Volley加载网络图片

出处:http://blog.youkuaiyun.com/guolin_blog/article/details/17482095 本篇文章中我们即将学习关于Volley更加高级的用法。 Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架。我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功

Solo_two的博客 440

Volley框架(二):使用Volley加载图片

在上一篇博客《Volley框架(一):使用Volley请求数据》中我们知道了使用Volley请求网络数据并封装成我们自定义的格式,今天我们就来看一下Volley的另外一个作用,使用Volley加载图片,同时使用Volley还能非常简单的实现内存和磁盘缓存,达到类似Universal-Image-Loader图片加载框架的功能。 使用Volley加载图片有三种方式: 1、使用ImageReq...

ITRenj的博客 780
上一篇: Android中关于Volley的使用(三)认识Volley的架构
下一篇: Android学习小Demo(14)Android中关于PopupWindow的使用
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值