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 ...
随机推荐
- java1.8环境配置+win10系统
Java环境配置相关 Java jdk 1.8版本的环境配置和1.7版本 存在一些差异,当然不同的操作系统可能会对jdk配置有一定的变化.本文我主要说1.8版本的jdk在window10 系统上的配置 ...
- 最直白、最易懂的话带你认识和学会---数据分析基础包之numpy的使用
前言 numpy是一个很基础很底层的模块,其重要性不言而喻,可以说对于新手来说是最基础的入门必须要学习的其中之一.在很多数据分析,深度学习,机器学习亦或是人工智能领域的模块中,很多的底层都会用到这个模 ...
- CTF中的EXP编写技巧 zio库的使用
zio库没有提供文档 这个是官方给出的一个例子程序 from zio import * io = zio('./buggy-server') # io = zio((pwn.server, 1337) ...
- 开始学习MaxCompute
https://help.aliyun.com/document_detail/34615.html?spm=a2c4g.11186623.6.688.jVxTMW
- TestDirector自定义管理:工程配置
一.工程配置 1.进入工程配置界面 2.点击“customize project entities”弹出自定义字段对话框.(这里有六个表,每个表中的字段分为系统字段(system fields)和用户 ...
- neo4j中索引的使用
neo4j可以对node和relationship中的属性建立索引,索引中的node(relationship)和属性对key-value为多对多的关系.一个node(relationship)可以在 ...
- XML DOM(Document Object Model)
1.XML DOM 是用于获取.更改.添加或删除 XML 元素的标准.2.节点(XML 文档中的每个成分都是一个节点): 整个文档是一个文档节点: 每个XML元素是一个元素 ...
- UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
"Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...
- JAVA编程思想读书笔记(三)--RTTI
接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...
- sublime 字体设置
安装完成sublime之后,推荐一种比较舒服的字体设置,个人习惯.配置步骤如下,打开sublime-->Preferences-->Settings - User 2.复制以下内容粘贴,并 ...