Volley 框架的介绍和使用

一:volley 简介

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

(1):volley的背景

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

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

(2)Volley提供的功能

1.json,图像等的异步下载,不用在去考虑图片下载的时候出现listview滚动过快,造成的没有必要的数据请求。2.网络请求的排序3.缓存的处理,代替了自己动手写,或者ImageLoader4.多级别的取消求情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() {@Overridepublic void onErrorResponse(VolleyError error) {}}){@Overridepublic 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() {@Overridepublic void onErrorResponse(VolleyError error) {FinishProgressDialog.FinishProgressDialogs();ShowToast.show(context,VolleyErrorHelper.getMessage(error, context),R.drawable.error_icon);if (failCallback != null) {failCallback.onFail();}}}){@Overridepublic byte[] getBody() throws AuthFailureError {return SecuritUtil.aesBase64Encode(data.toString()).getBytes();}};//设置请求超时的时间,以及失败重新请求的最大次数为1request.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() {@Overridepublic void onErrorResponse(VolleyError error) {FinishProgressDialog.FinishProgressDialogs();ShowToast.show(context,VolleyErrorHelper.getMessage(error, context),R.drawable.error_icon);if (failCallback != null) {failCallback.onFail();}}}){@Overridepublic 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() {@Overridepublic 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 框架的介绍和使用

相关文章:

你感兴趣的文章:

标签云: