上一篇博客(http://1029457926.iteye.com/blog/2203653)详细的讲了Volley的原理及用法,在实际开发中可能并不那么实用,下面来总结我们项目中是如何封装使用的。
1 Volley是用来请求网络数据的,首先我们要准备好要传递的URL参数
HashMap<String, String> params = new HashMap<String, String>(); params.put("user_id", userId); params.put("count", count + ""); params.put("since_time", timeSince); params.put("profile_user_id", profileUserId); String url = HttpConstant.DOMAIN_NORMAL + HttpConstant.FRIENDS_FANS_1;
2 把URL拼凑成一个完整的链接
public void get(String url, Map<String, String> data, String tag, final CallbackLightRequest<LightResponse> callback) { if (!ConfigRequests.isNetworkOkWithAlert(mContext)) { callNetworkError(tag, url, data, callback); return; } Map<String, String> defaultParams = ConfigRequests.getInstance().getDefaultParams(); if (defaultParams != null && defaultParams.size() > 0) { data.putAll(defaultParams); } if (data != null && data.size() > 0) { url = url + "?" + RequestUtils.map2QueryString(data); } this._get(url, tag, callback); }
拼凑URl的方法:map2QueryString
public class RequestUtils { /** * 生成QueryString,以 a=1&b=2形式返回 */ public static String map2QueryString(Map<String, String> map) { StringBuilder sb = new StringBuilder(); String value; try { if (map != null && map.size() > 0) { for (Entry<String, String> entry : map.entrySet()) { value = ""; value = entry.getValue(); if (StringUtils.isEmpty(value)) { value = ""; } else { value = URLEncoder.encode(value, Models.Encoding.UTF8); } sb.append(entry.getKey()).append("=").append(value) .append("&"); } sb.deleteCharAt(sb.length() - 1); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return sb.toString(); }
3 发送请求,并将请求放进Requestqueue中,我把请求统一封装在一个
AppRequest类中,这个类如下:
private void _get(final String url, final String tag, final Callback callback) { LogUtils.e(TAG, url); StringRequest req = new StringRequest(Request.Method.GET, url, new Listener<String>() { @Override public void onResponse(String text) { LogUtils.i(TAG, text); if (callback != null) { LightResponse res = new LightResponse(); res.tag = tag; res.url = url; res.status = Models.StatusCode.NetworkSuccess; res.setData(text); callback.onFinish(res); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (callback != null) { LightResponse res = new LightResponse(); res.tag = tag; res.url = url; res.status = Models.StatusCode.NetworkError; res.message = error.getMessage(); callback.onFinish(res); } } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { /* 此处是相对于实际业务配置的 */ return new HashMap<String, String>(); } }; mQueue.add(req); }
说明:Volley有2种回调一种是onResponse,一种是onErrorResponse,但是实际开发中可能需要更多的回调需要处理,例如:
1 请求服务器成功,数据无误
2 请求服务器成功,但是可能返回的JSON数据有问题
3 服务器请求成功,但是返回码有问题
4 无网络连接
5 网络正常,但是服务器没返给我们数据(刷新失败)
6 系统发生异常
......
当然我们可以根据实际业务需求来设定相应的回调。
上面我只做了一个CallBack来回调,不管请求失败还是成功,我都调用了onFinish()方法
4 回调处理
try { request.get(url, params, "", new CallbackLightRequest<LightResponse>() { @Override public void call(LightResponse response) { if (response.isReplied()) { ApiBeans.Followers2 bean = GsonUtil.getFromStr(ApiBeans.Followers2.class, response.getText());//json解析 if (bean != null && bean.data != null) { httpCallback.onResponse(bean.data);//请求成功 } else { httpCallback.onFailure(new RequestFailure(RequestFailure.Type.parse), null);//解析异常 } } else { httpCallback.onFailure(new RequestFailure(RequestFailure.Type.network), null);//网络异常 } } }); } catch (Exception ex) { httpCallback.onFailure(new RequestFailure(RequestFailure.Type.exception), ex);//异常处理 }
这里我做了2种类型的回调:
一 成功
二 失败(包含4种类型)
回调的接口如下:
public interface HttpCallback<T> { void onResponse(T response);//成功回调 void onFailure(RequestFailure failure, Exception ex);//异常处理 }错误的回调类型,这里当然也可以封装成一个泛型
public class RequestFailure { public enum Type { network,//网络问题 responseCode,//错误的返回码处理 exception,//系统异常 parse, //解析 } public RequestFailure(Type type) { this.what = type; } public Type what; }
network:代表网络连接异常
responseCode:错误的响应码处理
exception:系统异常处理
parse :Json解析异常
5 再次封装
当上面的代码写多了之后,你会发现你一直在写重复的代码,仔细看看除了回调的对象不一样之外,其它都参数都基本一样,很容易就想到用泛型来对上面的代码进行封装,代码如下:
public static void getFolowFansList(final Context context, final LightRequest request, String userId, String profileUserId, String timeSince, int count, final HttpCallback<ApiBeans.FollowerListObject<Fan>> httpCallback) { HashMap<String, String> params = new HashMap<String, String>(); params.put("user_id", userId); params.put("count", count + ""); params.put("since_time", timeSince); params.put("profile_user_id", profileUserId); String url = HttpConstant.DOMAIN_NORMAL + HttpConstant.FRIENDS_FANS_1; doRequest(request,url, data, httpCallback, ApiBeans.FollowerListObject.class); }把回调的代码用泛型进行封装
private static <T> void doRequest(LightRequest request, String url, HashMap<String, String> params, final HttpCallback callback, final Class<?> cls) { try { request.get(url, params, "", new CallbackLightRequest<LightResponse>() { @Override public void call(LightResponse response) { if (response.isReplied()) { T bean = GsonUtil.getFromStr(cls, response.getText()); if (bean != null) { callback.onResponse(bean); } else { callback.onFailure(new RequestFailure(RequestFailure.Type.parse), null); } } else { callback.onFailure(new RequestFailure(RequestFailure.Type.network), null); } } }); } catch (Exception ex) { callback.onFailure(new RequestFailure(RequestFailure.Type.exception), null); } }
6 volley 在项目中进行业务处理
下面看看如何现在封装的Volley在项目中进行业务处理的?
model.getFasList(mContext, lightRequest, Global.userDetail.userId, profileUserId, thisTimeSince, count, new HttpCallback<ApiBeans.FollowerListObject<Fan>>() { @Override public void onResponse(ApiBeans.FollowerListObject<Fan> data) { try { //数据返回成功 if (data.userList != null) { adapter.setIsAllLoaded(data.infoCount < Constant.FEED_DEFAULT_NUM); lv.setIfHasMore(data.infoCount, Constant.FEED_DEFAULT_NUM); if (isRefresh) { adapter.setDataList(data.userList); lv.setAdapter(adapter); } else { adapter.addDataList(data.userList); adapter.notifyDataSetChanged(); } } else { //刷新失败 if (isRefresh) { ToastModel.showRefreshFail(mContext); } else { ToastModel.showLoadMoreError(mContext); } } } catch (Exception e) { } finally { isDownloading = false; if (loadingView != null) { loadingView.setVisibility(View.GONE); loadingView = null; } refreshEnd(); } } @Override public void onFailure(RequestFailure failure, Exception ex) { //网络异常 if (failure.what == RequestFailure.Type.network) { ToastModel.showRed(mContext, R.string.tip_network_error); } else if (failure.what == RequestFailure.Type.parse) { //解析失败 ToastModel.showRed(mContext, "解析失败"); } else if (failure.what == RequestFailure.Type.exception) { //系统异常 ToastModel.showRed(mContext, "系统异常"); } } }); }
代码方便简单,通熟易懂,层次分明,逻辑清晰有没有呢?Volley不仅简化了我们的开发流程,而且可以让我们更专注于我们的业务处理。这是volley非常大的一个优点。
相关推荐
网络请求框架volley-master网络请求框架volley-master
Volley是Google官方推出的一款高效的Android网络请求框架,专为Android平台设计,旨在提供轻量级、快速且易于使用的网络通信库。它以其强大的缓存机制、线程管理以及对异步请求的良好支持而受到开发者欢迎。Volley的...
**Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一款专门为Android平台设计的网络通信框架,它以其高效的性能、简单的API和良好的可扩展性,成为了众多Android开发者进行网络请求时的...
【Android网络请求框架Volley详解】 在Android应用开发中,网络请求是不可或缺的一部分,Volley是Google推出的一个高效的网络请求库,它优化了网络通信,提供了便捷的API接口,使得开发者能够快速、轻松地实现网络...
在Android应用开发中,网络请求是必不可少的一部分,用于获取服务器数据、更新用户界面等操作。Volley是由Google推出的一款高效、易用的网络请求库,它优化了HTTP请求的处理,提高了性能,特别适合实时性要求较高的...
本篇文章将详细介绍几个常用的Android网络请求框架:OkHttp、Volley、HttpClient以及XUtils。 一、OkHttp OkHttp是由Square公司开发的一款高效的网络请求库,它具有以下特点: 1. **连接池**:OkHttp维护了一个...
**Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一个高效的网络通信库,主要用于Android应用中的网络请求。Volley的设计目标是提供一个轻量级、高性能的库,使开发者能够更方便地处理...
Volley的设计目标是为了优化Android应用的性能,减少网络请求的延迟,提高用户体验。它内置了缓存机制,能够自动处理网络请求的缓存策略,减少了不必要的网络通信。Volley还支持多种请求类型,如GET、POST等,并且...
Volley是Google为Android开发的一款高效的网络通信库,它的设计目标是简化网络请求,并优化了内存管理和线程处理,使得在网络交互中能提供快速、流畅的用户体验。在本篇文章中,我们将深入探讨Volley的基本使用,...
上传的是一个eclipse下的android工程,主要展示的是对android 的网络通信框架 Volley的简单使用,展示了一些api的使用,有get和post方法的请求方式以及网络图片的缓存等等,我正是使用了这个demo 完成了我的一个在线...
【Android 网络通信框架 Volley 的解析和比较】 在 Android 应用程序开发中,网络通信是不可或缺的一部分,主要用于客户端和服务端的数据交互。Volley 是 Google 在 2013 年的 Google I/O 大会上推出的一款针对 ...
Volley是Google在2013年的I/O大会上推出的一款高效的Android网络通信框架,它专为Android应用设计,旨在简化网络请求的处理,提高应用程序的响应速度和用户体验。这款框架的核心理念是快速、高效和易用,使得开发者...
Volley是Google在2013年I/O大会上推出的一款强大的网络请求库,专为Android应用设计,旨在简化网络通信并优化性能。它的主要特点包括高效的数据缓存、线程管理以及对异步请求的优秀支持,使得开发者可以快速、方便地...
本文将对HttpClient和Volley这两款网络请求框架进行详细的性能对比。 HttpClient,全称为Apache HttpClient,是一个基于HTTP协议的客户端编程工具包。它提供了丰富的API,可以处理各种HTTP请求,如GET、POST等。...
Volley是Google为Android开发的一款高效的网络通信框架,它的设计目标是简化网络请求,并优化Android设备上的图片加载。Volley以其高效、灵活和易于使用的特性,成为许多Android开发者首选的网络库。 首先,我们来...