volley框架介绍
来源:互联网 发布:linux php posix扩展 编辑:程序博客网 时间:2024/05/29 18:12
volley介绍
开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;
而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程上异步执行所有请求而避免了阻塞主线程。
目前的HTTP通信框架,AsyncHttpClient,网络图片加载框架,Universal-Image-Loader,而Volley是将以上两个框架集于一身。
volley下载
git clone https://android.googlesource.com/platform/frameworks/volley
或者使用我的地址,很久没有更新了,请见谅,解决了SSL证书问题以及做了简单的缓存
volley特点
- 自动调度网络请求
- 多个并发的网络连接
- 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
- 支持请求优先级
- 支持取消请求的强大API,可以取消单个请求或多个
- 易于定制
- 健壮性:便于正确的更新UI和获取数据
- 包含调试和追踪工具
volley使用
我一般都是使用封装好的方法
创建volleyHttpClient对象
封装了返回Gson和String的get,post请求以及相应需要增加oauth验证的方法
public class VolleyHttpClient { public static final int GET = 1; public static final int GET_AOUTH = 2; public static final int POST = 3; public static final int POST_AOUTH = 4; public static final int GETSTRING = 5; public static final int GETSTRING_AOUTH = 6; public static final int POSTSTRING_AOUTH = 7; private static final String TAG = "VolleyHttpClient"; private static HttpService httpService; private final static Gson gson = new Gson(); private static BaseActivity activity; public VolleyHttpClient(HttpService httpService) { this.httpService = httpService; } /** * 传入初始化好的httpService 实例 * * @param httpService * @return */ public static VolleyHttpClient newInstance(HttpService httpService, Context context) { activity = (BaseActivity) context; if (httpService != null) { return new VolleyHttpClient(httpService); } return null; } public void post(ApiRequest apiRequest) { doNetTask(POST, apiRequest, DataCacheType.NO_CACHE); } public void postWithOAuth(ApiRequest apiRequest) { doNetTask(POST_AOUTH, apiRequest, DataCacheType.NO_CACHE); } public void get(ApiRequest apiRequest) { doNetTask(GET, apiRequest, DataCacheType.NO_CACHE); } public void getWithOAuth(ApiRequest apiRequest) { doNetTask(GET_AOUTH, apiRequest, DataCacheType.NO_CACHE); } public void doNetTask(int method, ApiRequest apiRequest) { doNetTask(method, apiRequest, DataCacheType.NO_CACHE); } public void doNetTask(int method, ApiRequest apiRequest, DataCacheType cacheType) { doNetTask(method, apiRequest, cacheType, false, null); } public void doNetTask(int method, ApiRequest apiRequest, DataCacheType cacheType, boolean needLogin, BaseActivity activity) { doNetTask(method, apiRequest, cacheType, needLogin, activity, false); } public void doNetTask(int method, ApiRequest apiRequest, DataCacheType cacheType, boolean needLogin, BaseActivity activity, boolean needFinish) { if (needLogin && activity.app.getUserParam() == null) { try { activity.cancelLoadingDialog(); } catch (Exception e) { e.printStackTrace(); } Intent intent = new Intent(activity, LoginActivity_.class); activity.startActivity(intent); if (needFinish) { activity.finish(); } return; } switch (method) { case GET: //USER_OLD_CACHE有缓存先加载缓存数据,然后网络请求只是保存数据 //TEMP_CACHE有缓存先加载缓存数据,不进行网络请求 get(apiRequest, false, cacheType); break; case GET_AOUTH: get(apiRequest, true, cacheType); break; case POST: post(apiRequest, false, cacheType); break; case POST_AOUTH: post(apiRequest, true, cacheType); break; case GETSTRING: getByStringRequest(apiRequest, false, cacheType); break; case GETSTRING_AOUTH: getByStringRequest(apiRequest, true, cacheType); break; case POSTSTRING_AOUTH: postByStringRequest(apiRequest, true, cacheType); break; } } /** * 不用传header以及accesstoken的GET请求 * * @param apiRequest */ public void get(ApiRequest apiRequest, boolean needOauth, DataCacheType cacheType) { Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); if (needOauth) { String accessToken = GlobalPhone.token; if(TextUtils.isEmpty(accessToken)){ accessToken = DataCache.getDataCache() .queryCache("access_token"); } if (!TextUtils.isEmpty(accessToken)) { LogUtils.e("access_token", accessToken); }// header.put("Authorization", "Bearer" + " " + accessToken); header.put("token", accessToken); } String url = apiRequest.getUrl(Method.GET); Listener listener = apiRequest.getListener(); LogUtils.e("------cacheType---------", cacheType.name()); switch (cacheType) { case USE_OLD_CACHE: case TEMP_CACHE: String cacheStr =""; if(cacheType == DataCacheType.TEMP_CACHE){ cacheStr = DataCache.getDataCache().queryTempCache(url); }else { cacheStr = DataCache.getDataCache().queryCache(url); } if (!TextUtils.isEmpty(cacheStr)) { try { if (apiRequest.getResponseType() != null) { //有缓存先加载缓存数据 listener.onResponse(gson.fromJson(cacheStr, apiRequest.getResponseType())); //有缓存先加载缓存数据,不进行网络请求 if (cacheType == DataCacheType.TEMP_CACHE) { return; } } else { listener.onResponse(cacheStr); if (cacheType == DataCacheType.TEMP_CACHE) { return; } } } catch (JsonSyntaxException e) { e.printStackTrace(); } } break; default: break; } GsonRequest request = new GsonRequest(Method.GET, url, apiRequest.getResponseType(), header, null, listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); //网络错误并且使用TEMP_CACHE和use old cache还有待考察 if (!useCache(apiRequest.getResponseType(), url, listener)) { httpService.addToRequestQueue(request); } } public void post(ApiRequest apiRequest, boolean needOauth, DataCacheType cacheType) { Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); if (needOauth) { String accessToken = GlobalPhone.token; if(TextUtils.isEmpty(accessToken)){ accessToken = DataCache.getDataCache() .queryCache("access_token"); } if (!TextUtils.isEmpty(accessToken)) { LogUtils.e("access_token", accessToken); }// header.put("Authorization", "Bearer" + " " + accessToken); header.put("token", accessToken); } LogUtils.e("------cacheType---------", cacheType.name()); String url = apiRequest.getUrl(Request.Method.POST); Listener listener = apiRequest.getListener(); if (apiRequest.getParams() != null && apiRequest.getParams().size() > 0) { //post有参数时候请求不建议使用use_old_cache方式,因为根据路径存储,post参数不在路径中 if (cacheType == DataCacheType.USE_OLD_CACHE) { cacheType = DataCacheType.CACHE; } } switch (cacheType) { case USE_OLD_CACHE: case TEMP_CACHE: String cacheStr = DataCache.getDataCache().queryCache(url); if (!TextUtils.isEmpty(cacheStr)) { try { if (apiRequest.getResponseType() != null) { //有缓存先加载缓存数据 listener.onResponse(gson.fromJson(cacheStr, apiRequest.getResponseType())); //有缓存先加载缓存数据,不进行网络请求 if (cacheType == DataCacheType.TEMP_CACHE) { return; } } else { listener.onResponse(cacheStr); if (cacheType == DataCacheType.TEMP_CACHE) { return; } } } catch (JsonSyntaxException e) { e.printStackTrace(); } } break; default: break; } GsonRequest request = new GsonRequest(Request.Method.POST, url, apiRequest.getResponseType(), header, apiRequest.getParams(), listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); //网络错误并且使用TEMP_CACHE和use old cache还有待考察 if (!useCache(apiRequest.getResponseType(), url, listener)) { httpService.addToRequestQueue(request); } } /** * 图片请求 */ public ImageLoader.ImageContainer loadingImage(ImageView imageView, String url, int loadingResid, int errorResid, BitmapCache mCache, ImageLoader.ImageListener listener) { if (listener == null) { listener = ImageLoader.getImageListener(imageView, loadingResid, errorResid); } if (httpService.httpQueue != null) { ImageLoader imageLoader = new ImageLoader(httpService.httpQueue, mCache); return imageLoader.get(url, listener); } return null; } public void loadingImage(ImageView imageView, String url, int loadingResid, int errorResid, BitmapCache mCache) { loadingImage(imageView, url, loadingResid, errorResid, mCache, null); } /** * StringRequest */ public void getByStringRequest(ApiRequest apiRequest, boolean needOauth, DataCacheType cacheType) { Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); if (needOauth) { String accessToken = GlobalPhone.token; if(TextUtils.isEmpty(accessToken)){ accessToken = DataCache.getDataCache() .queryCache("access_token"); } if (!TextUtils.isEmpty(accessToken)) { LogUtils.e("access_token", accessToken); }// header.put("Authorization", "Bearer" + " " + accessToken); header.put("token", accessToken); } String url = apiRequest.getUrl(Request.Method.GET); Listener listener = apiRequest.getListener(); StringRequest request = new StringRequest(Request.Method.GET, url, header, null, listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); if (!useCache(null, url, listener)) { httpService.addToRequestQueue(request); } } /** * StringRequest */ public void postByStringRequest(ApiRequest apiRequest, boolean needOauth, DataCacheType cacheType) { Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); String url = apiRequest.getUrl(Request.Method.POST); Listener listener = apiRequest.getListener(); if (needOauth) { String accessToken = GlobalPhone.token; if(TextUtils.isEmpty(accessToken)){ accessToken = DataCache.getDataCache() .queryCache("access_token"); } if (!TextUtils.isEmpty(accessToken)) { LogUtils.e("access_token", accessToken); }// header.put("Authorization", "Bearer" + " " + accessToken); header.put("token", accessToken); } Map<String, String> params = new HashMap<String, String>(); for (String key : apiRequest.getParams().keySet()) { params.put(key, (String) apiRequest.getParams().get(key)); } StringRequest request = new StringRequest(Request.Method.POST, url, header, params, listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); if (!useCache(null, url, listener)) { httpService.addToRequestQueue(request); } } /** * 断网情况使用缓存处理 * * @param clazz * @param url * @param listener * @return */ private boolean useCache(Class clazz, String url, Listener listener) { HttpService.httpQueue.getCache().invalidate(url, true); if (!NetWorkUtils.detect(httpService.getContext())) { String cacheStr = DataCache.getDataCache().queryCache(url); if (cacheStr != null) { try { if (clazz != null) { listener.onResponse(gson.fromJson(cacheStr, clazz)); } else { listener.onResponse(cacheStr); } return true; } catch (JsonSyntaxException e) { e.printStackTrace(); return false; } } return false; } else { return false; } } public void getExtWithOAuth(com.core.api.event.request.Request apiRequest) { getExtWithOAuth(apiRequest, DataCacheType.NO_CACHE); } public void getExtWithOAuth(com.core.api.event.request.Request apiRequest, DataCacheType cacheType) { String url = apiRequest.getUrl(Request.Method.GET) + "?" + apiRequest.httpParam.encodeParametersToString("UTF-8"); Listener listener = apiRequest.getListener(); Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); String accessToken = GlobalPhone.token; if(TextUtils.isEmpty(accessToken)){ accessToken = DataCache.getDataCache() .queryCache("access_token"); } header.put("token", accessToken); GsonRequestExt request = new GsonRequestExt(Request.Method.GET, url, apiRequest.getResponseType(), header, apiRequest.httpParam, listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); if (!useCache(apiRequest.getResponseType(), url, listener)) { httpService.addToRequestQueue(request); } } public void getExt(com.core.api.event.request.Request apiRequest, DataCacheType cacheType) { Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); String url = apiRequest.getUrl(Request.Method.GET) + "?" + apiRequest.httpParam.encodeParametersToString("UTF-8"); Listener listener = apiRequest.getListener(); GsonRequestExt request = new GsonRequestExt(Request.Method.GET, url, apiRequest.getResponseType(), header, apiRequest.httpParam, listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); if (!useCache(apiRequest.getResponseType(), url, listener)) { httpService.addToRequestQueue(request); } } public void postExt(com.core.api.event.request.Request apiRequest, DataCacheType cacheType) { Map<String, String> header = new HashMap<String, String>(); if (apiRequest.getHeaders() != null) { header.putAll(apiRequest.getHeaders()); } header.put("code", ApiSettings.VERSION_CODE); header.put("osType", ApiSettings.OSTYPE); String accessToken = GlobalPhone.token; if(TextUtils.isEmpty(accessToken)){ accessToken = DataCache.getDataCache() .queryCache("access_token"); } if (!TextUtils.isEmpty(accessToken)) { header.put("token", accessToken); } String url = apiRequest.getUrl(Request.Method.POST); Listener listener = apiRequest.getListener(); GsonRequestExt request = new GsonRequestExt(Request.Method.POST, url, apiRequest.getResponseType(), header, apiRequest.httpParam, listener, apiRequest.getErrorlistener(), cacheType); request.setShouldCache(false); if (!useCache(apiRequest.getResponseType(), url, listener)) { httpService.addToRequestQueue(request); } } // volley框架缓存 // if (HttpService.httpQueue.getCache().get(url) != null) { // String cacheStr = new String(HttpService.httpQueue.getCache() // .get(url).data); // // if (cacheStr != null) { // // try { // listener.onResponse(cacheStr); // // } catch (JsonSyntaxException e) { // e.printStackTrace(); // } // // return; // } // // }}
使用
- 先创建基础Request,所有Request的继承他
public class ApiRequest { public String url = ""; protected Map<String, Object> params = null; private Class<?> clazz; private Response.Listener<?> listener; private Response.ErrorListener errorlistener; protected Map<String, String> headers; public ApiRequest(String values, Class<?> clazz) { this(values, clazz, false); } public ApiRequest(String values, Class<?> clazz, boolean isChonggou) { if (isChonggou) { this.url = values; } else { this.url = String.format("%1$s%2$s", ApiSettings.URL_BASE, values); } this.clazz = clazz; this.params = new HashMap<String, Object>();// params.put("versionCode",ApiSettings.VERSION_CODE); this.headers = new HashMap<String, String>(); } public String getUrl(int method) { switch (method) { case Method.GET: return urlWithParameters(url, params); case Method.POST: return url; } return url; } public Map<String, Object> getParams() { if (params.isEmpty()) { Log.e("REQUEST_PARAMS", "null"); return null; } return params; } public void setParams(Map<String, Object> params) { this.params = params; } public Class getResponseType() { return clazz; } public Response.Listener<?> getListener() { return listener; } public void setListener(Response.Listener<?> listener) { this.listener = listener; } public Response.ErrorListener getErrorlistener() { return errorlistener; } public void setErrorlistener(Response.ErrorListener errorlistener) { this.errorlistener = errorlistener; } public Map<String, String> getHeaders() { if (headers.isEmpty()) { Log.e("REQUEST_Header", "null"); return null; } return headers; } public void setHeaders(Map<String, String> headers) { this.headers = headers; } public void addParams(Map<String, Object> params) { if (this.params != null) { this.params.putAll(params); } else { this.params = new HashMap<String, Object>(); this.params.putAll(params); } } public static String urlWithParameters(String url, Map<String, Object> params) { StringBuilder builder = new StringBuilder(); if (params != null) { for (HashMap.Entry<String, Object> entry : params.entrySet()) { if (builder.length() == 0) { if (url.contains("?")) { builder.append("&"); } else { builder.append("?"); } } else { builder.append("&"); } builder.append(entry.getKey()).append("=") .append(entry.getValue()); } } return url + builder.toString(); }}
- 创建相应的request,ApiConstans中存放所有请求的路径
public class AnswerListRequest extends ApiRequest implements ApiConstants { public AnswerListRequest(int page,int pageSize) { super(API_ANSWERLIST, AnswerListResponse.class); params.put("page",page); params.put("pageSize",pageSize); }}
当然,所有请求可以放到一个library包,做抽离
0 0
- 转Volley 框架介绍
- android volley框架介绍
- volley框架介绍
- Step1 Volley 框架介绍
- Volley框架使用介绍
- Volley框架的介绍使用
- Volley框架的介绍使用
- Volley框架的使用介绍
- Android网络处理框架Volley介绍说明
- Volley框架解析(一)-----整体介绍
- Volley 框架的介绍和使用
- Volley框架
- Volley框架
- Volley框架
- Volley框架
- Volley框架
- volley框架
- Volley框架
- C++对象的内存分析(3)
- NDK交叉编译之自定义工具链
- OOP面向对象——实例——9*9乘法表
- spring中的设计模式
- Java中挽救的比较器--Comparator接口
- volley框架介绍
- C++对象的内存分析(4)
- KMP(最小循环节)
- OOP面向对象——实例——电梯类
- Fragment销毁之后Editext状态的清除
- Java数据类型及equals、==区别
- 数据结构学习笔记
- ubuntu移植jsoncpp到Android平台
- C++对象的内存分析(5)