android开发对volley的封装

大部分的android应用开发都会涉及到网络操作,而在网络操作中绝大部分又是http的操作,你可能会选用java的 HttpUrlConnection、也可能是Apache的HttpClient,想要高度的封装的还有Google的亲儿子Volley,其他的还有诸如OkHttp,Xutils等很多第三方的框架。

而我在开发中更加倾向于使用Google的Volley,毕竟亲儿子嘛,虽然用起来比一些三方的要复杂一点,但是我们完全可以自己封装一下,这篇博客,我们就去高度封装一下volley,让volley看上去逼格更好。

你理想中的封装是怎样呢?

Net.url().params().parser().get();

看看这样的封装对不对你的胃口,还是我们更加简化一下,形如这样:

Net.get(url, params, parser, callback)

今天我们就来实现一下第二种操作方式的封装!

分析一下参数,url不用说了,params我们直接使用Map? no,肯定要对Map进行简单的封装,为什么要封装?volley需要的就是map格式的参数啊?我们还是需要形如:

new RequestParams().put().put().put...

这样的级联操作,封装很简单,看代码:

/**
 * 发送网络请求
 * post方法的 参数对象
 * @author loader
 *
 */
public class RequestParams {
	private LinkedHashMap<String, String> mParams;

	public RequestParams() {
		mParams = new LinkedHashMap<String, String>();
	}

	/**
	 * 添加参数
	 * @param key 键
	 * @param value 值
	 * @return
	 */
	public RequestParams add(String key, Object value) {
		mParams.put(key, value.toString());
		return this;
	}

	public LinkedHashMap<String, String> get() {
		return mParams;
	}
}

不多说了, 继续下一个参数parser,parser是干嘛的? 当然是用来解析网络请求的返回值的,大部分情况下是返回json,当然也有可能是xml,那为什么不是在callback里去解析呢? 这里主要是为了解耦。也就是解析部分的代码并不影响callback, 第二个好处就是parser和callback可以并行开发,写callback的coder可以和写parser的coder并行开发,甚至可以先于parser。说了这么多parser的好处,我们来赶紧看看parser是个啥玩意吧!

	/**
	 * 解析数据
	 * @author loader
	 * @param <T>
	 */
	public interface Parser<T> {
		public Result<T> parse(String response);
	}

仅仅是一个接口,而且返回值是一个Result的泛型,来看看Result:

/**
 * 
 * @author loader
 *
 * @param <T>
 */
public class Result<T> {
	public static final int ERR = 0; // error
	public static final int OK = 1; // ok

	private int status; // 状态 ERR  OK
	private String msg; // 错误信息
	private T result; // 结果
	private Object obj; // 附加

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public T getResult() {
		return result;
	}

	public void setResult(T result) {
		this.result = result;
	}

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}

	public boolean isOK() {
		return status == OK;
	}
}

两个常量,代表成功和失败,status的取值在ERR和OK中选择,msg是失败的原因,成功的时候可以不用管它,result是我们的结果,还有一个obj是一个附加值,有时候我们可能要返回不只一个的值(参考了Message)。

这里面最重要的就是那个T result了,这个T是我们在写parser的时候指定的。也就是我们parser想返回什么类型,我们的结果就是什么类型。

继续回到Parser,说到他是一个接口,那对于我的项目,我还提供了一个抽象的基类,来看看:

/**
 * 解析器的基类
 * @author loader
 *
 * @param <T>
 */
public abstract class AbsParser<T> implements Parser<T> {

	@Override
	public Result<T> parse(String response) {
		Result<T> result = new Result<T>();
		try {
			JSONObject baseObject = new JSONObject(response);
			if(!baseObject.optBoolean("success")) 
				throw new Exception(baseObject.optString("message"));

			result.setStatus(Result.OK);
			parseResponse(baseObject, result);
		} catch (Exception e) {
			result.setStatus(Result.ERR);
			result.setMsg(e.getMessage());
			e.printStackTrace();
		}

		return result;
	}

	/**
	 * 解析json内容
	 * @param baseObject
	 * @return
	 */
	public abstract void parseResponse(JSONObject baseObject, 
			Result<T> result) throws Exception;
}

在这里,我们实现了parse方法,在parse方法中去解析了公用的部分,而且又提供了一个抽象的parseResponse方法供用户去扩展解析。

还有一个callback,也是一个接口,需要我们自己去实现:

	/**
	 * 回调数据
	 * @author loader
	 * @param <T>
	 */
	public interface Callback<T> {
		public void onSuccess(Result<T> result);
		public void onFailed(String msg);
	}

成功的时候返回Result,失败了是message。

哦,对了,对于volley的封装呢?细心的朋友可能发现了一个VolleyManager,来看一下:

/**
 * 封装volley
 * @author loader
 *
 */
public class VolleyManager {
	private RequestQueue mRequestQueue;

	private static VolleyManager sInstance;

	public synchronized static VolleyManager getInstance() {
		if(sInstance == null) sInstance = new VolleyManager();
		return sInstance;
	}

	private VolleyManager() {
		mRequestQueue = Volley.newRequestQueue(App.getInstance());
	}

	/**
	 * 添加一个请求
	 * @param request
	 */
	public <T> void add(Request<T> request) {
		mRequestQueue.add(request);
	}

	/**
	 * 添加一个请求,并设置tag
	 * @param request
	 * @param tag
	 */
	public <T> void add(Request<T> request, Object tag) {
		request.setTag(tag);
		add(request);
	}

	/**
	 * 取消全部请求
	 */
	public void cancelAll() {
		mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
			@Override
			public boolean apply(Request<?> request) {
				return true;
			}
		});
	}

	/**
	 * 取消指定tag的请求
	 * @param tag
	 */
	public void cancel(Object tag) {
		mRequestQueue.cancelAll(tag);
	}
}

提供了一个单例,去add一个请求。

好了,封装的代码就这些,我们来看看使用吧。

/**
 * 
 * @author loader
 *
 */
public class UserBiz {
	/**
	 * 用户登录
	 * @param phoneNumber
	 * @param pwd
	 * @param li
	 */
	public void login(final String phoneNumber, final String pwd,
			final Callback<Boolean> callback) {
		String url = Constants.LOGIN_URL + "?mobile=" + phoneNumber + 
				"&password=" + pwd + "&apptype=2&type=2";
		Net.get(url, new LoginParser(), callback);
	}
}

继续看看LoginParser:

class LoginParser extends AbsParser<Boolean> {
		@Override
		public void parseResponse(JSONObject baseObject, Result<Boolean> result)
				throws Exception {
			if(baseObject.optBoolean("success")) {
				JSONObject dataObject = null;
				if (baseObject.has("userinfo")) {
					dataObject = baseObject.optJSONObject("userinfo");
				}else if (baseObject.has("barberinfo")) {
					dataObject =baseObject.optJSONObject("barberinfo");
				}
				if(dataObject == null) {
					result.setStatus(Result.ERR);
					return;
				}

				User user = new User();
				onUserInfo(dataObject, user);

				result.setStatus(Result.OK);
				result.setResult(baseObject.optBoolean("success"));
			}else {
				result.setStatus(Result.ERR);
				result.setMsg(baseObject.optString("message"));
			}

		}
	}

根据自己的解析结果去给Result赋值,到现在结果已经出来了,那就需要Callback回调到UI了:

mUserBiz.login(mPhoneNumber, mPassword, mLoginListener);
private Callback<Boolean> mLoginListener = new Callback<Boolean>() {
		@Override
		public void onFailed(String msg) {
			Log.debug("failed:" + msg);
		}

		@Override
		public void onSuccess(Result<Boolean> result) {

			boolean success = result.getResult();
			if(!success) {
				Log.debug("登录失败");
				return;
			}

			// TODO : 成功后你的逻辑
		}
};

在mLoginListener中根据Result的结果去做不同的逻辑。

ok,至此一次简单的volley封装就完成了,而且实现了Parser和Callback的分离,是不是很爽? 当然你也可能将parser部分放在callback里,没有什么是不可以的,视你的项目而定。

时间: 2024-10-14 00:16:55

android开发对volley的封装的相关文章

android 开发 - 使用okhttp框架封装的开发框架

概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 oknet是一套基于okhttp的android网络http框架,封装了请求参数处理,日志打印. Github地址 https://github.com/vir56k/oknet 特性 1.简洁的语法 2.支持自定义处理 message code 不等于0 的情形 3.支持文件上传 4.完整清晰的l

android开发学习 ------- volley网络请求的实例

在  http://www.sojson.com/httpRequest/  上对http进行访问,将此访问在android中的应用 **************************************************************************************** 对于上边的请求,在Android中这样写就可以成功: public void test(String customerId, String pinNumber){ String url =

快速Android开发系列网络篇之Volley

Volley是Google推出的一个网络请求库,已经被放到了Android源码中,地址在这里,先看使用方法 RequestQueue mRequestQueue = Volley.newRequestQueue(context); JsonObjectRequest req = new JsonObjectRequest(URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONO

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下网络框架,之前也了解过一些开源网络通讯架构,也大概看了一部分源码,比如Afinal.Volley.AndBase.Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有很多地方需要注意和优化,这里就不贴出来献丑了,感兴趣的朋友可以去查阅学习上面所说的

Android开发之搜芽项目的图片加载问题(使用Volley进行网络图片加载)

搜芽的移动开发这几天进度相对来说非常的快.但是美中不足的就是网络图片的加载问题.我有两套方案: 1)沿用迅雷动漫的图片加载.迅雷动漫也是用的一个开源的库.但是不知道是我使用出了问题还是真的是它的问题.在我迅速的下拉和回倒的时候, 不确定的会出现崩溃.logcat显示loadImage里面出现了内存溢出.out of memory..这个我想应该不是我的问题. 2)采用外包的AsyncImageLoader.这个文件我没有仔细看.然后实验结果是,加载图片巨慢.而且容易导致卡顿. 所以,我将希望转向

Android开发实践:WIFI连接功能的封装

在上一篇文章<Android开发实践:WIFI扫描功能的封装>介绍了如何利用Andriod的API实现WIFI的扫描,本文则重点讲述一下如何连接WIFI吧,在此,也给出一个封装WIFI连接过程的类,提供简单的接口以供在各个代码工程中复用. 与WIFI扫描类似,WIFI的连接同样是一个耗时的过程,所以需要放到线程中执行,通过回调来通知调用者连接结果.该回调接口的定义如下: public interface WifiConnectListener { public void OnWifiConne

上门洗车APP --- Android客户端开发 之 网络框架封装(二)

上门洗车APP --- Android客户端开发 之 网络框架封装(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装,相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解,这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 dataRequest 方法 和

Android开发总结

出来工作半年多了,没啥好交代的,就说说自己半年来的Android开发经历. 1.IDE      这半年来,从Eclipse到Android Studio,经历了两个IDE,在这里做一下简单的评价. 如果真要说,Android Studio是基本上大胜Eclipse的,至少Android Studio不会像Eclipse那样卡,公司配的电脑是渣了点,64位,wein7,只有4G内存,跑Eclipse跑久了简直就是噩梦. Android Studio的智能提示比Eclipse强多了,快捷键也很强大

Android working with Volley Library

Volley提供了优美的框架,使得Android应用程序网络访问更容易和更快.Volley抽象实现了底层的HTTP Client库,让你不关注HTTP Client细节,专注于写出更加漂亮.干净的RESTful HTTP请求.另外,Volley请求会异步执行,不阻挡主线程. Volley提供的功能 简单的讲,提供了如下主要的功能: 1.封装了的异步的RESTful 请求API: 2.一个优雅和稳健的请求队列: 3.一个可扩展的架构,它使开发人员能够实现自定义的请求和响应处理机制: 4.能够使用外