您的位置:首页 > 理论基础 > 计算机网络

Android Volley 具体解释 Google公布的一套用于网络通信的工具库

2017-06-18 11:57 375 查看
下载地址:git clone https://android.googlesource.com/platform/frameworks/volley
或 : https://github.com/mcxiaoke/android-volley

Volley 能作什么

Google 2013 I/O 大会上公布的一个网络通信库。

处理一些网络方面的请求,如数据解析、下载显示图片。

· 数据处理:对网络请求获取的数据的处理。

· 图片载入:对网络图片的下载及显示。

使用步骤

使用权限

<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

初始化请求队列

RequestQueue mRequestQueue = Volley.newRequestQueue(Context context);

网络请求数据处理

默认提供两种数据请求类型,一为StringRequest,一为JsonRequest

JsonRequest又分:

· JsonArrayRequest

JsonArrayRequest request = new JsonArrayRequest("url",
new Response.Listener<JSONArray>() {

@Override
public void onResponse(JSONArray response) {//请求响应返回的JSONArray

}
},
new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {

}
});
mRequestQueue.add(request);


· JsonObjectRequest

JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null,
new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {//请求响应返回的JSONObject
System.out.println(response);
}
},
new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
System.out.println("test4JsonObjectRequest - error");
}
});

mRequestQueue.add(request);
mRequestQueue.add(request); 将请求增加队列。 能够有非常多个add 入队操作。然后start

mRequestQueue.start(); 启动请求

mRequestQueue.stop(); 停止请求

图片载入请求

· ImageRequest 载入图片

使用方式与上面的JsonRequest类似

private void requestByImageRequest(final ImageView imageView, String url) {
ImageRequest imgRequest = new ImageRequest(url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {//下载成功后
imageView.setImageBitmap(bitmap);
}
},
imageView.getWidth(), imageView.getHeight(), Config.RGB_565,
new ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) { //下载出错

}
});
mRequestQueue.add(imgRequest);
mRequestQueue.start();
}


· ImageLoader 载入图片

private void requestByImageLoader(ImageView imageView, String url) {
int maxMemory = (int) Runtime.getRuntime().maxMemory();//app最大内存 字节数
int mCacheSize = maxMemory / 8;  //以1/8 用作缓存
final LruCache<String, Bitmap> mLruImageCache = new LruCache<String, Bitmap>(mCacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size
if (android.os.Build.VERSION.SDK_INT >= 12) {
return value.getByteCount(); //须要api >=12 , 总字节数
} else {
return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1
}
}
};
ImageCache imageCache = new ImageCache() {
@Override
public void putBitmap(String key, Bitmap value) {
mLruImageCache.put(key, value);
}

@Override
public Bitmap getBitmap(String key) {
return mLruImageCache.get(key);
}
};
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
// ImageLoader.getImageListener的第二个參数是默认的图片resource id,请求的图片为空时设置
// 第三个參数是请求失败时候的资源id,能够指定为0
ImageListener listener = ImageLoader.getImageListener(
imageView, android.R.drawable.ic_menu_rotate,
android.R.drawable.ic_delete);
mImageLoader.get(url, listener); //get方法已经開始运行了载入url-bitmap

//		ImageContainer imageContainer = mImageLoader.get(url, listener); //get方法已经開始运行了载入url-bitmap
//		Bitmap bitmap = imageContainer.getBitmap();
//		String requestUrl = imageContainer.getRequestUrl();
}


ImageLoader 须要结合 ImageCache来进行构造。

ImageCache是一个interface

ImageCache 的put/get Bitmap的方法 。推荐使用LruCache来实现。

ImageListener 是一个interface,提供两个方法:onResponse(),onResponseError()

ImageLoader 图片载入流程:ImageLoader.get(url, listener),推断是否存在于cache中。假设有。则直接取出并在listener中显示。假设没有,则new
一个ImageRequest,增加到requestQueue中。将listener中对应的方法在ImageRequest中的Response.Listener中进行调用。

· NetworkImageView 载入图片

private void requestByNetworkImg(NetworkImageView imageView, String url) {
final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(8*1024*1024) {
@Override
protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size
return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1
}
};
ImageCache imageCache = new ImageCache() {
@Override
public void putBitmap(String key, Bitmap value) {
mImageCache.put(key, value);
}

@Override
public Bitmap getBitmap(String key) {
return mImageCache.get(key);
}
};
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
/*
* seturl时。里面的实现是:有了ImageLoader,就能运行载入url-bitmap的操作
*/
imageView.setDefaultImageResId(0); //默认图
imageView.setErrorImageResId(0); //错误图
imageView.setImageUrl(url, mImageLoader);
}


这是一个继承自ImageView的自己定义组件。

imageView.setDefaultImageResId(0); //默认图

imageView.setErrorImageResId(0); //错误图

imageView.setImageUrl(url, mImageLoader);

结合了ImageLoader,内部调用ImageLoader.get()来实现图片的载入。

在ListView中的item使用NetworkImageView:

仅仅须要new 一个ImageLoader对象。不同的item,set不同的URL就可以。

由于在ImageLoader中会new不同的ImageRequest加到RequestQueue中运行下载。

自己定义Request

/**
* Volley adapter for JSON requests that will be parsed into Java objects by Gson.
*/
public class GsonObjectRequest<T> extends Request<T> {
protected final Gson gson = new Gson();
protected final Class<T> clazz;
protected final Map<String, String> headers;
protected final Listener<T> listener;

/**
* Make a GET request and return a parsed object from JSON.
*
* @param url URL of the request to make
* @param clazz Relevant class object, for Gson's reflection
* @param headers Map of request headers
*/
public GsonObjectRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(method, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
}

public GsonObjectRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
this(Method.GET, url, clazz, headers, listener, errorListener);
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ?

headers : super.getHeaders();
}

@Override
protected void deliverResponse(T response) {
listener.onResponse(response);
}

//将请求获取的json转成 用gson 转成了相应的对象
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(
response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}
自己定义Request。至少须要重写 parseNetworkResponse() 、deliverResponse()

其它说明

Volley 类中定义了磁盘缓存文件夹。

Request .cancel() ,能够取消一个请求。

Request .setTag(String tag)。设置一个tag

RequestQueue .cancelAll(String tag),取消同一tag标识的Request

RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 须要取消的Request

演示样例:http://download.csdn.net/detail/jjwwmlp456/8176595
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: