Volley 框架的引见和使用

Volley 框架的介绍和使用

一:volley 简介


究竟什么是volley呢,在以前的开发过程中,我们需要和网络进行通信的时候,使用的东西包括:httpclient,HttpURLConnection,AsyncTask,AsyncTaskLoader,或者说一些其他的开源框架,比如:ImageLoader处理图片,gson处理数据,而volley呢,是Google I/O在2013上,发布出来的一套用于Android 平台上的网络通信库,能够使用网络通信更快,更简单,更方便,更健壮。

Volley 框架的引见和使用


(1):volley的背景

        比如以前从网上下载图片的步骤可能是这样的流程:
1.在ListAdapter#getView()里开始图像的读取。
2.通过AsyncTask等机制使用HttpURLConnection从服务器去的图片资源
3.在AsyncTask#onPostExecute()里设置相应ImageView的属性。
4.或者说,我们处理图像的时候,使用ImageLoader做处理。



比如:listview在做图片处理的时候,会考虑到listview滚动过快,可能导致有些网络请求返回的时候,早已经滚过了当时的位置,根本没必要显示在list里了,虽然我们可以通过创建内部类ViewHolder进行优化来保持url等来实现防止两次取得,但是那些已经没有必须要的数据,还是会浪费系统的各种资源。
对于listview的优化,在以前的博客中有提到,如果不了解,请参考:http://blog.****.net/u011546655/article/details/41827089




(2)Volley提供的功能

1.json,图像等的异步下载,不用在去考虑图片下载的时候出现listview滚动过快,造成的没有必要的数据请求。
2.网络请求的排序
3.缓存的处理,代替了自己动手写,或者ImageLoader
4.多级别的取消求情
5.Activity结束时同时取消所有网络请求





二:如何使用volley

(1)下载volley框架,导入到自己的项目中:sdk版本至少要在8以上

(2)在项目中使用volley


1.创建RequestQueue  

RequestQueue mQueue = Volley.newRequestQueue(context);

2.Url组建 

这个是根据自己的需求组建url


3.创建StringRequest    参数:method请求方法  Url地址  lietener监听器

StringRequest request = new StringRequest(Method.POST, urls, new Listener<String>() {
				public void onResponse(String response) {
					result = SecuritUtil.aesBase64Decode(response);
					
				}
			}, new ErrorListener() {
				@Override
				public void onErrorResponse(VolleyError error) {
					
				}
			}){
				@Override
				public byte[] getBody() throws AuthFailureError {
					
				}
				
			};

4.添加StringRequest到RequestQueue对象中

request.setRetryPolicy(new DefaultRetryPolicy(300*1000, 1, 1.0f));
			mQueue.add(request);


5.设置回调接口

	// 成功传递一个结果进来
	public static interface SuccessCallback {
		void onSuccess(String result);
	}

	// 失败不做操作
	public static interface FailCallback {
		void onFail();
	}

(3)以上便完成了一个volley框架的使用,的确,看起来使用起来非常的简单,而且功能强大,很多东西都不用自己去考虑,就能够完成自己想要做的任何事情,对于开发者来首,实现非常的快。


· (4)在这里,我贴上一些,我们在开发过程中是如何使用volley框架的

package com.x1.dao;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.x1.tools.Config;
import com.x1.tools.FinishProgressDialog;
import com.x1.tools.SecuritUtil;
import com.x1.tools.ShowToast;
import com.x1.tools.VolleyErrorHelper;
import com.x1.ui.R;

public class NetConnection {
	// 实现具体的操作
	// 传入successCallback,failCallback这两个参数的目的是把相关的状态通知给外界
	// kvs是参数对
	private String urls = null, result = null;
	private Object datas;
	private StringRequest request;
	public NetConnection(final Context context, final String url, final int method,final SuccessCallback successCallback,final FailCallback failCallback, final Object... kvs) {
		//得到RequestQueue对象
		RequestQueue mQueue = Volley.newRequestQueue(context);
		// 配置上传的参数
		// 创建参数对
		final JSONObject data = new JSONObject();
		if (kvs.length == 1) {
			datas =  kvs[0];
		} else if (kvs.length > 1) {
			try {
				for (int i = 0; i < kvs.length; i += 2) {
					// 规则:0--key,1--value
					// 2--key,3--value依次类推往后排
					data.put(kvs[i].toString(), kvs[i + 1]);
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}
		} else if (kvs.length == 1 && kvs[0].equals("")) {
			urls = url;
		}
		switch (method) {
		case Config.Method_POST:
			urls = url;
			request = new StringRequest(Method.POST, urls, new Listener<String>() {
				public void onResponse(String response) {
					result = SecuritUtil.aesBase64Decode(response);
					if (result != null) {
						if (successCallback != null) {
							successCallback.onSuccess(result);
						}
					} else {
						if (failCallback != null) {
							failCallback.onFail();
						}
					}
					FinishProgressDialog.FinishProgressDialogs();
					System.out.println("Return data: " + result);
				}
			}, new ErrorListener() {
				@Override
				public void onErrorResponse(VolleyError error) {
					FinishProgressDialog.FinishProgressDialogs();
					ShowToast.show(context,VolleyErrorHelper.getMessage(error, context),R.drawable.error_icon);
					if (failCallback != null) {
						failCallback.onFail();
					}
				}
			}){
				@Override
				public byte[] getBody() throws AuthFailureError {
					return SecuritUtil.aesBase64Encode(data.toString()).getBytes();
				}
				
			};
			//设置请求超时的时间,以及失败重新请求的最大次数为1
			request.setRetryPolicy(new DefaultRetryPolicy(300*1000, 1, 1.0f));
			mQueue.add(request);
			break;
		case Config.Method_PUT:
			urls = url;
			request = new StringRequest(Method.PUT, urls, new Listener<String>() {
				public void onResponse(String response) {
					result = SecuritUtil.aesBase64Decode(response);
					if (result != null) {
						if (successCallback != null) {
							successCallback.onSuccess(result);
						}
					} else {
						if (failCallback != null) {
							failCallback.onFail();
						}
					}
					FinishProgressDialog.FinishProgressDialogs();
					System.out.println("Return data: " + result);
				}
			}, new ErrorListener() {
				@Override
				public void onErrorResponse(VolleyError error) {
					FinishProgressDialog.FinishProgressDialogs();
					ShowToast.show(context,VolleyErrorHelper.getMessage(error, context),R.drawable.error_icon);
					if (failCallback != null) {
						failCallback.onFail();
					}
				}
			}){

				@Override
				public byte[] getBody() throws AuthFailureError {
					return SecuritUtil.aesBase64Encode(data.toString()).getBytes();
				}
			};
			request.setRetryPolicy(new DefaultRetryPolicy(300*1000, 1, 1.0f));
			mQueue.add(request);
			break;
		case Config.Method_GET:
			if (kvs.length == 1) {
				urls = url + datas.toString();
			} else if (kvs.length > 1) {
				urls = url + "?" + data.toString();
			}
			request = new StringRequest(Method.GET, urls, new Listener<String>() {
				public void onResponse(String response) {
					result = SecuritUtil.aesBase64Decode(response);
					if (result != null) {	
						if (successCallback != null) {
							successCallback.onSuccess(result);
						}
					} else {
						if (failCallback != null) {
							failCallback.onFail();
						}
					}
					FinishProgressDialog.FinishProgressDialogs();
					System.out.println("Return data: " + result);
				}
			}, new ErrorListener() {
				@Override
				public void onErrorResponse(VolleyError error) {
					FinishProgressDialog.FinishProgressDialogs();
					ShowToast.show(context,VolleyErrorHelper.getMessage(error, context),R.drawable.error_icon);
					if (failCallback != null) {
						failCallback.onFail();
					}
				}
			});
			request.setRetryPolicy(new DefaultRetryPolicy(300*1000, 1, 1.0f));
			mQueue.add(request);
			break;
		}
		System.out.println("Request url:" + urls);
		System.out.println("Request data:" + data.toString());
	}
	// 成功传递一个结果进来
	public static interface SuccessCallback {
		void onSuccess(String result);
	}

	// 失败不做操作
	public static interface FailCallback {
		void onFail();
	}
}





三:volley的设计


Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。如下图所示


Volley 框架的引见和使用



四:总结

volley框架,其实也就是让我们在以前使用中的一些东西如:gson,httpclient,ImageLoader等框架的结合体,综合起来,比自己写的要好的多,也要健壮和简单的多,不过volley也是有缺点的,volley适合用户频繁的获取数据,对于大数据的处理,这样相差很多,当然也有许多好的框架开发比如:xutils等等。

以上有些关于volley的一些分析和知识点来自于原文:http://blog.****.net/t12x3456/article/details/9221611