Volley简介###
在实习期间, 公司经常会用到频繁但数据量较小的网络通信, 这时候我忽然想起了在大三期间接触到的一个网络请求框架(当时只是来加载图片来着, 而且现在使用的也不是Volley), 所以今天再拿出来整理一下.
优点#####
- 非常适合进行数据量不大,但通信频繁的网络操作
- 可直接在主线程调用服务端并处理返回结果
- 可以取消请求,容易扩展,面向接口编程
- 网络请求线程NetworkDispatcher默认开启了4个,可以优化,通过手机CPU数量
- 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
缺点#####
- 使用的是httpclient、HttpURLConnection
- 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar
- 对大文件下载 Volley的表现非常糟糕
- 只支持http请求
- 图片加载性能一般
概述###
Volley的请求方法都是大同小异, 分为三个步骤
1. 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
在这里我们不需要为每一次的请求创建队列, 只需要在一个Activity初始化的时候生成队列, 在需要网络交互的时候, 加入请求就可以了.
2. 创建请求
3. 将请求添加到队列中
以下是几个请求的例子:
GET 请求####
// 1. 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 2. 添加一个请求
StringRequest stringRequest = new StringRequest(url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//获取到网络数据的监听
Log.e(TAG, "onResponse: "+response );
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//发生异常的监听
Log.e(TAG, "onErrorResponse: "+error.toString() );
}
});
// 3. 将创建的请求加入请求队列
requestQueue.add(stringRequest);
POST请求####
在POST请求中, 必须将第一个请求的第一个参数指定为Request.Method.POST, 并在构造函数中,重写getParams方法.
// 1. 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 2. 创建post请求
StringRequest request = new StringRequest(
Request.Method.POST,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//获取到数据
Log.e(TAG, "onResponse: "+response );
}
}
,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//发生异常
Log.e(TAG, "onErrorResponse: "+error.toString() );
}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// 在此处添加Post请求使用的参数
Map map=new HashMap<String, String>();
map.put("value1","value1");
return map;
}
};
// 3. 将post请求添加到队列
requestQueue.add(request);
请求JSON数据####
// 1. 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 2. 创建JsonObject请求
JsonObjectRequest request = new JsonObjectRequest(url,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//请求成功,返回json数据
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//请求失败
}
});
// 3. 将请求加入队列
requestQueue.add(request);
Volley请求图片###
使用ImageRequest请求图片####
// 1. 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 2. 创建图片请求
ImageRequest request = new ImageRequest(
url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//成功获取图片
}
},
300, //0 表示不对图片最大宽高进行处理
300,
ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
// 3. 将请求加入请求队列
requestQueue.add(request);
ImageLoader的用法####
-
绝对不要因为"会"而停止学习, 谁知道你学到的下一个会更好用呢
ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。 -
使用步骤
-
创建一个RequestQueue对象。(不啰嗦了)
-
创建一个ImageLoader对象。
ImageLoader imageLoader = new ImageLoader(mQueue,
new ImageCache() { //第二个参数为图片缓存
@Override
public void putBitmap(String url, Bitmap bitmap) {
}@Override public Bitmap getBitmap(String url) { return null; } });
-
获取一个ImageListener对象。
ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.default_image, R.drawable.failed_image); -
调用ImageLoader的get()方法加载网络上的图片。
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener,200,200);
第三个和第四个参数为限制图片的最大宽度和高度,也可以不写,默认加载原图
基本使用是结束了, 但是 ,我们还没有用它的缓存, 这里我们新建一个类用来缓存图片,设置默认的最大值为6M
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 6 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
接下来我们修改第二步, 这样就可以使用缓存了.
ImageLoader imageLoader = new ImageLoader(mQueue,new BitmapCache ());
NetworkImageView####
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:
- 创建一个RequestQueue对象。(相信这句话大家看的都不想看了)
- 创建一个ImageLoader对象。
- 在布局文件中添加一个NetworkImageView控件。
<com.android.volley.toolbox.NetworkImageView />
在布局文件中就可以限制图片的大小, 自动压缩. 如果不想压缩的话, 宽高设置为wrap_content就好 - 在代码中获取该控件的实例。
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
- 设置要加载的图片地址。
networkImageView.setDefaultImageResId(R.drawable.default_image); //设置加载中的图片(默认图片)
networkImageView.setErrorImageResId(R.drawable.failed_image); // 设置加载失败时的图片
networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
imageLoader);
网友评论