Android开发利用Volley框架下载和缓存网络图片
2013年Google I/O大会上推出了一种新的网络通信框架——Volley,Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。volley.jar下载
一.使用Volley框架下载网络图片
(1)首先,创建Application类,声明并且实例话RequestQueue。
在App.java文件中:
public class App extends Application
{
private static RequestQueuequeues;// Volley加载队列
@Override
public void onCreate()
{
super.onCreate();
queues =Volley.newRequestQueue(getApplicationContext());// 实列话
}
}
[注意]需要在AndroidManifest.xml中配置这个APP类:
<application
android:name=".App"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
...........
</application>
(2)在需要下载图片的地方,使用Volley框架进行网络操作(如ListView的Adapter中,在getView方法中可以使用)
ImageView iv = (ImageView)findViewById(R.id.iv);
String url = "http://.............../test.png" // 图片的地址
ImageRequest request =new ImageRequest(url,new Listener<Bitmap>()
{
@Override
public void onResponse(Bitmap response)
{// 加载成功,显示头像
iv.setImageBitmap(response);
}
},0,0,Config.RGB_565,new ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{ // 加载出错调用的函数
iv.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.error));
}
});
if (! url.equals(""))
{
App.getHttpQueue().add(request);
}
[说明]
Volley.ImageRequest(String url,Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig,ErrorListenererrorListener)
url:为图片下载的地址;
listener:为下载成功的监听, 其onResponse方法中的Bitmap对象就是获得成功之后得到的图片(Bitmap response);
maxWidth与maxHeight:与系统对图片处理(压缩和拉伸),若设置为0,则系统不对图片进行这些处理;
errorListener:拉取图片出错的监听。
[注意]上面的方法,实现了数量不大,但频繁的网络加载图片的操作,可以用在ListView图片加载以及单一图片加载的过程,但是有一个缺点,比如在ListView中加载,会加载当前现实的ListView的Item的图片,上下滑动的过程中,对于显示出的Item,会重现进行网络下载,这样就浪费了流量,因此我们需要结合图片缓存机制和Volley一起进行网络图片加载使用。
二.Volley框架+BitmapCache进行网络图片加载和缓存
(1)首先,创建Application类,声明并且实例话RequestQueue。
在APP.java文件中:
public class APP extends Application
{
private static RequestQueue queues; // Volley加载队列
@Override
public void onCreate()
{
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext()); // 实列话
}
}
[注意]需要在AndroidManifest.xml中配置这个APP类:
<application
android:name=".App"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
...........
</application>
(2).创建图片缓存类BitmapCache.java(借助了LruCache实现缓存)
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.toolbox.ImageLoader.ImageCache;
//用来图片缓存的类
public class BitmapCache implements ImageCache
{
public LruCache<String,Bitmap>cache;
public int max =10 *1024 *1024;// 设置缓存的最大为10M
public BitmapCache()
{
cache =new LruCache<String,Bitmap>(max)
{
@Override
protected int sizeOf(String key,Bitmap value)
{
return value.getRowBytes() *value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url)
{
returncache.get(url);
}
@Override
public void putBitmap(String url,Bitmap bitmap)
{
cache.put(url,bitmap);
}
}
(3)调用Volley进行下载和缓存图片:
String url = "http://.........../test.png";
ImageView img = (ImageView)findViewById(R.id.img);
ImageLoader loader =new ImageLoader(App.getHttpQueue(),new BitmapCache());
ImageListener listener =ImageLoader.getImageListener(img,R.drawable.default_icon,R.drawable.error_icon);
loader.get(url, listener);
<注意>上面的操作由于需要网络支持,以及会在内存中读写内容,因此需要在AndroidManifest.xml中加入必要的操作权限:
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Android开发利用Volley框架下载和缓存网络图片的更多相关文章
- Android开发学习——Volley框架
转载至: http://blog.csdn.net/guolin_blog/article/details/17482095 一些概念性的东西 大家进入上边链接理解,我贴一下 具体的实现代码: pub ...
- Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转
Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...
- Android开发常用开源框架:图片处理
https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...
- Android开发利用shareSDK等第三方分享,弹出的是英文名称。例如Genymotion模拟器
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发利用shareSDK等第三方分享,弹出的是英文名称.例如Genymotion模拟器就 ...
- android 开发 - 使用okhttp框架封装的开发框架
概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...
- Android之使用Volley框架在ListView中加载大量图片
1.listview 中的条目要用 Volley 中的 NetworkImageView,如果直接用ImageView也可以,但是要在getView方法中使用url地址设置为imageView的tag ...
- Android平台利用OpenCL框架实现并行开发初试
http://www.cnblogs.com/lifan3a/articles/4607659.html 在我们熟知的桌面平台,GPU得到了极为广泛的应用,小到各种电子游戏,大到高性能计算,多核心.高 ...
- Android开发——利用Cursor+CursorAdapter实现界面实时更新
好久没有更新博客了.不是没时间写,而是太懒.而且感觉有些东西没有时间总结,之之后再想写,就想不起来了.晚上新发现一点东西,所以就及时写下来. 最近利用业余时间在看Android的Download模块, ...
- Android开发之常用框架WebView详解代码。超详细,送给初学者,完全掌握此控件
这是我特意为新手小白写的一个代码,教大家完完全全掌握WebView, 我感觉,你看懂这个,基本上可以满足以后工作中的需要了,(只针对Webview的使用),但是其实它还有好多功能,比如真正的设计到和H ...
随机推荐
- Erasure Coding(纠删码)深入分析 转
1.前言 Swift升级到2.0大版本后宣称开始支持纠删码,这其实是一个很有意义的特性,主要是能够在一定程度上解决3副本空间浪费太多的问题.因为3副本这一点是swift推广的最大障碍之一,成本的增加吓 ...
- golang基础之三-字符串,时间,流程控制,函数
strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirngs ...
- 解决IE的背景颜色透明子元素不透明问题
假设背景为黑色,70%半透明,对需要半透明的层用如下CSS background-color: #000000; /* background color for IE */ filter: alpha ...
- 【LOJ】#2174. 「FJOI2016」神秘数
题解 这道题的结论很显然= = 就是暴力求的话,把一个区间的数排一下序,如果当前这个数大于前面所有数的前缀和+1,那么前缀和+1即我们所求的答案 那么我们设置一个当前答案(初始为1),在主席树上求出来 ...
- logstash收集nginx日志
(1)安装nginx 1.安装nginx yum install epel-release -y yum install nginx -y 2.修改日志文件格式为json #vim /etc/ngin ...
- 更换 ECharts 散点图图标(散点图中symbol的使用)
更换 ECharts 散点图图标 使用symbol关键字
- OOD沉思录 --- 继承
一,继承只应被用来为特化层次结构建模 实际上也就是要满足LSP原则,水果类<-榴莲的继承是特化 二,派生类必须知道他们的基类,基类不应当知道他们的派生类 复用的前提 三,基类中的所有 ...
- linux网络管理----Linux网络配置
1.1 linux配置IP地址 1️⃣ ifconfig命令临时配置IP地址 能不能自动获取IP地址和DNS地址,要看有没有DHCP服务器 win10上,输入ipconfig /all 会看到是否有D ...
- C# 消除累计误差的倒计时
使用 C# 中自带的各种 timer 计时,都会有累计误差,以下代码实现了一种消除累计误差的方法,使得每次计时的误差,空值在 100 ms 以内(可以通过修改代码提升精度.) 对于精度要求在秒级别的简 ...
- 图形管线之旅 Part5
原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑 转载请注明出处 在上一篇关于纹理采样器之后,我们现在回到了3D前端.那 ...