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的优化,在以前的博客中有提到,如果不了解,请参考: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框架,其实也就是让我们在以前使用中的一些东西如:gson,httpclient,ImageLoader等框架的结合体,综合起来,比自己写的要好的多,也要健壮和简单的多,不过volley也是有缺点的,volley适合用户频繁的获取数据,对于大数据的处理,这样相差很多,当然也有许多好的框架开发比如:xutils等等。
以上有些关于volley的一些分析和知识点来自于原文:http://blog.****.net/t12x3456/article/details/9221611