什么是Volley以及为什么使用Volley
在我们android开发过程中不可避免的要进行网络访问,android为我们提供了两种方式来访问网络:HttpURLConnection和HttpClient
而使用这两种类来访问网络的时候仍然需要大量的代码来实现,而且对于不熟练的人来说很容易出错。
并且由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以在Android 5.1中,HttpClient类已被废弃。
谷歌为了使网络访问更加简易在2013年推出了Volley。
volley的优点和不足:
1、默认Android2.3及以上HttpURLConnection(因为2.3以下这个类有很多Bug),2.3以下使用HttpClient;
2、缓存机制优秀;
3、请求队列可以针对优先级排序;
4、提供多种取消机制;
5、图片加载异常简单(这项比较重要,不需要考虑内存优化和图片加载时的内存溢出);
6、使用非常简单;
7、官方提供,必须是精品啊。
不足:Volley在轻量的网络访问中表现优秀,但是对于流媒体和大数据文件的传输支持不够。
基于以上种种原因我们使用Volley。
如何使用Volley?
首先我们要下载Volley。
谷歌gitbut地址:
https://android.googlesource.com/platform/frameworks/volley
也可以从我的csdn资源上下载:
http://download.csdn.net/download/baidu_31093133/9511419
将下载的jar包复制到android工程的libs目录下。
首先说一下volley的requestQueue,使用volley的第一步就是建立一个这样的请求队列用于存放自己的网络请求。
通常我们会在application里建立一个全局的请求队列。
如下:
public class MyApplication extends Application {public static RequestQueue queues;@Overridepublic void onCreate() {super.onCreate();queues = Volley.newRequestQueue(getApplicationContext());} public static RequestQueue getHttpQueues() {return queues;}
}
使用StringRequest:
String url = " http://op.juhe.cn/onebox/weather/query?cityname=%E6%B8%A9%E5%B7%9E&key=5fc2b142029b1b0d371d5449a8b8927d";
StringRequest request = new StringRequest(Method.GET, url, newListener() {@Overridepublic void onResponse(String response) {Toast.makeText(MainActivity.this, "网络访问成功"+,Toast.LENGTH_LONG).show();}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Toast.makeText(MainActivity.this, error.toString(),Toast.LENGTH_LONG).show();}});request.setTag("lhdGet");MyApplication.getHttpQueues().add(request);
使用JsonObjectRequest:
JsonObjectRequest request2 = new JsonObjectRequest(Method.GET, url, null, new Response.Listener() {@Overridepublic void onResponse(JSONObject response) {Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_LONG).show();}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();}});request2.setTag("lhdGet2");MyApplication.getHttpQueues().add(request2);
StringRequest和JsonObjectRequest的区别:
当我们不清楚网络访问的返回值的时候就使用StringRequest,如果知道返回值是一个Json格式的文件就使用JsonObjectRequest
Volley获取网络图片:
1、ImageRequest
1、创建一个RequestQueue
2、创建一个ImageRequest
3、将ImageRequest添加到RequestQueue
事实上StringRequest,JsonRequest和ImageRequest都是继承自Request的所以它们的用户也都类似。
示例:
ImageRequest imageRequest = new ImageRequest( http:new Response.Listener() { @Override public void onResponse(Bitmap response) { imageView.setImageBitmap(response); } }, 0, 0, Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } });
最后将这ImageRequest对象添加到RequestQueue里。
2、ImageLoader
ImageLoader的内部是使用ImageRequest来实现的,但它ImageLoader更高效,因为它不仅可以缓存图片,还可以防止重复发送同样的请求。
使用步骤:
1、创建一个RequestQueue
2、创建一个ImageLoader
3、自定义一个类继承ImageCache
4、创建一个ImageListener
5、加载网络图片
1、创建RequestQueue同上面
2、创建ImageLoader
示例:
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCash());
其中自定义BitmapCash()类是继承ImageCache的实现类
3、自定义BitmapCash类继承ImageCache
BitmapCash:
public class BitmapCash implements ImageCache{public LruCachecache;public int max = 10*1024*1024;public BitmapCash () {cache = new LruCache(max){@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getRowBytes()*value.getHeight();}};}@Overridepublic Bitmap getBitmap(String url) {return cache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {cache.put(url, bitmap);}
}
4、//创建ImageListener
ImageListener listener =
//顶一个参数是加载图片的imageView控件
ImageLoader.getImageListener(imageView,
//第二个参数是默认图片 第三个是访问失败时加载图片
R.drawable.ic_launcher, R.drawable.ic_launcher);
5、获取图片。第一个参数是图片地址,第二个是ImageListener 然后使用loader.get(url, listener);来获取网络图片。
如果想指定图片的宽和高
也可以使用loader.get(url, listener, 200, 200);
有了以上的基础,相信大家对Volley网络访问有一定的了解了吧,接下来描述会简洁一点。
3、NetworkImageView
这是volley提供的一个自定义控件,具备imageview控件的所有功能,并自带加载网络图片的功能。
NetworkImageView使用步骤:
- 创建一个RequestQueue
- 创建一个ImageLoader
- 在布局文件中添加一个NetworkImageView控件
- 代码中实例化该控件的
- 设置要加载的图片地址
1、2步同上
3、步骤直接在xml布局文件使用该控件
4、使用findviewById()实例化控件
5、获取图片:
String url = "http://img1.imgtn.bdimg.com/it/u=2680373034,1460593141&fm=21&gp=0.jpg";
imageView.setDefaultImageResId(R.drawable.ic_launcher);
imageView.setErrorImageResId(R.drawable.ic_launcher);
imageView.setImageUrl(url, loader);