初次接触volley网络框架,进行初步封装使用

volley是google官方出的一个Android网络访问库,可以进行http访问和图片的网络异步获取(类似于imageloader)。

由于才刚开始练习面向对象编程,所以就想对volley进行初步封装根据自己的喜好来使用。

先说说volley的最基本用法:

在导入了jar后,在需要做网络访问的地方申请一个请求队列:

	private RequestQueue mRequestQueue;
        mRequestQueue = Volley.newRequestQueue(this);
一般在一个activity中只要一个请求队列,在需要访问网络时就new一个request实例再add到队列中就可以了。

建立一个StringRquest(是Request<T>的一个之类):

 StringRequest myRequest = new StringRequest(Method.GET,url, new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				Log.d("string request success linstener", arg0 + "");
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Log.d("string request error linstener", arg0.getMessage() + "");
			}
		});
这个是一个最简单的get方法请求。

还可以建立一个post方法请求:

        StringRequest myRequest = new StringRequest(Method.POST,url, new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				Log.d("string request success linstener", arg0 + "");
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Log.d("string request error linstener", arg0.getMessage() + "");
			}
		}){

			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				// TODO Auto-generated method stub
				Map<String, String> map = new HashMap<String, String>();
				return map;
			}
        	
        };
在post方法中,需要设置post所带的参数,就重载request的getParams方法,以map的形式输入。

最后就是把建立好的request实例add到队列中:

        mRequestQueue.add(myRequest);
这样volley的基本使用就完成了。


到这里,就觉得要根据不同的请求每次new一个不同request,而且有时候还要重载各种方法,所以就打算做一个简单初步的封装使用。


最开始我先建立两个基类:

1,AbsRequest.java 这个类是Request的抽象(下面这个抽象的实现会详细说明):

public abstract class AbsRequest<T> extends Request<T> {
	//父类函数
	public AbsRequest(int method, String url, ErrorListener listener) {
		super(method, url, listener);
	}
	//访问网络成功后返回的Response处理
	@Override
    protected abstract Response<T> parseNetworkResponse(NetworkResponse response) ;
	//编辑头部需要带的信息
	@Override
	public abstract Map<String, String> getHeaders() throws AuthFailureError ;
	//获取访问网络的方式get/post
	@Override
	public abstract int getMethod() ;

	
	//获取需要访问的地址
	@Override
	public abstract String getUrl() ;

	//获取访问网络需要带的参数
	@Override
	protected abstract Map<String, String> getParams() throws AuthFailureError ;
	

	//访问网络成功返回后的操作
	@Override
	protected abstract void deliverResponse(T paramT);
	
	
}

2.RequestCallBack.java 这个是网络访问后对应的回调:

public abstract class RequestCallBack implements Response.Listener<String>,Response.ErrorListener{
	
	public Response.Listener<String> mSuccessCallBack = new Listener<String>() {

		@Override
		public void onResponse(String arg0) {
			// TODO Auto-generated method stub
			RequestCallBack.this.onResponse(arg0);
		}
	};
	
	public Response.ErrorListener mErrorCallBack = new ErrorListener() {

		@Override
		public void onErrorResponse(VolleyError arg0) {
			// TODO Auto-generated method stub
			RequestCallBack.this.onErrorResponse(arg0);
		}
	};
	
	@Override
	public abstract void onResponse(String arg0);

	@Override
	public abstract void onErrorResponse(VolleyError arg0);
	
}
然后,现在每一个网络请求都建立一个类,继承 AbsRequest,我这里就建立一个TextRequest,访问百度翻译api的(在注释中有详细的讲解):

public class TextRequest extends AbsRequest<String> {
		public RequestCallBack mCallBack; 
		public Map<String, String> mPostMap;
		public Map<String, String> mHeadersMap;
		private int method;
		private static String url = "http://192.168.1.36:8080/volloryText/post.php";
		//private static String url = "http://192.168.1.36:8080/volloryText/post.php";
		private static String urls = "http://openapi.baidu.com/public/2.0/bmt/translate";
		private static String BAIDUKEY = "xxxxxxxxxxxxx";
		private static String src = "我不认识你的啊";
		private static String parm; 
		//用于初始化的,可以根据自己的实际需要添加参数
		/*觉得值得一提的就是,super中设置的super(0,url, callBack.mErrorCallBack);
		 * 第一个参数是网络访问方式get/post,第二个参数是地址的url
		 * 我曾经出现过的疑问就是如果我get方法需要再url中带参数,我是不是要在初始化实体的时候就把带参数的url建立好
		 * 如果是的话,那建立这个独立的类的意义就不大了,所以答案是否定的。
		 * 这里super只是设定一个默认值,到真正访问网络的时候,会优先使用重载函数getUrl()和getMethod()等的返回值。
		 * 所以我们只需要把值传入内部进行处理,在外只要一句话就能初始化实体。
		 * 
		 */
		public TextRequest(int method,RequestCallBack callBack) {
			super(0,url, callBack.mErrorCallBack);
			// TODO Auto-generated constructor stub
			this.method = method;
			this.mCallBack = callBack;
			this.setShouldCache(false);
		}
	
	
		public TextRequest(int method,String id,String name,String sex,RequestCallBack callBack) {
	//		super(url + "?" + parm, callBack.mSuccessCallBack, callBack.mErrorCallBack);
			super(0,url, callBack.mErrorCallBack);
		
			this.setShouldCache(false);
		}
		
	
		/*
		 * (non-Javadoc)
		 * @see com.example.textvolley.AbsRequest#parseNetworkResponse(com.android.volley.NetworkResponse)
		 * 这个类是处理返回的信息类型的,response中包含就所有访问网络后返回的数据,这里是用volley中的一个工具类HttpHeaderParser来定义返回数据的编码方式
		 * 因为volley在默认情况加是不支持中文的,所以如果在访问的http头信息中没有定义编码方式,他就会默认使用iso-8859-1
		 * 我们就需要HttpHeaderParser.parseCharset(response.headers, "UTF-8")来指定,不然有可能会出现中文乱码
		 */
		
		@Override
	    protected Response<String> parseNetworkResponse(NetworkResponse response) {
			String parsed;
		    try {
		      parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers, "UTF-8"));
		    } catch (UnsupportedEncodingException e) {
		      parsed = new String(response.data);
		    }
		    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
	    } 
	
		/*
		 * (non-Javadoc)
		 * @see com.example.textvolley.AbsRequest#getHeaders()
		 * 设置头信息
		 */
		@Override
		public Map<String, String> getHeaders() throws AuthFailureError {
			// TODO Auto-generated method stub
			if (mHeadersMap != null){
			mHeadersMap.put("charset", "UTF-8");
			return mHeadersMap;
			}
			else{
				mHeadersMap = new HashMap<String, String>();
				mHeadersMap.put("charset", "UTF-8");
				return mHeadersMap;
			}
		}
		/*
		 * (non-Javadoc)
		 * @see com.example.textvolley.AbsRequest#getMethod()
		 * 设置访问网络的方式get/post
		 */
		@Override
		public int getMethod() {
			// TODO Auto-generated method stub
			return this.method;
		}
	
		
		/*
		 * (non-Javadoc)
		 * @see com.example.textvolley.AbsRequest#getUrl()
		 * 设置网络地址,在这里可以添加get参数
		 */
		@Override
		public String getUrl() {
			// TODO Auto-generated method stub
			return urls + buildURL();
		}

		/*
		 * (non-Javadoc)
		 * @see com.example.textvolley.AbsRequest#getParams()
		 * 添加post的参数
		 */
		@Override
		protected Map<String, String> getParams() throws AuthFailureError {
			// TODO Auto-generated method stub
			if (mPostMap != null){
				return mPostMap;
			}
			else{
				mPostMap = new HashMap<String, String>();
				mPostMap.put("parm", "我不知道你说什么");
				return mPostMap;
			}
		}
		/*
		 * 生成get参数的url穿,指定使用utf-8
		 */
		public String buildURL(){
			List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();  
			params.add(new BasicNameValuePair("client_id", BAIDUKEY));  
			params.add(new BasicNameValuePair("q", src));  
			params.add(new BasicNameValuePair("from", "auto"));  
			params.add
			(new BasicNameValuePair("to", "wyw"));  
			//对参数编码  
			String p = URLEncodedUtils.format(params, "UTF-8");  
			
			parm = "?" + p;
			return parm;
		}

		/*
		 * (non-Javadoc)
		 * @see com.example.textvolley.AbsRequest#deliverResponse(java.lang.Object)
		 * 访问网络成功后,返回需要做的,一般是调用callback回调。
		 */
		@Override
		protected void deliverResponse(String paramT) {
			// TODO Auto-generated method stub
			System.out.println(paramT);
			mCallBack.mSuccessCallBack.onResponse(paramT);
		}


	
		
	
}

这样在需要使用翻译api的地方

 RequestCallBack callBack = new RequestCallBack() {
			
			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				Log.d("string request success linstener", arg0 + "");
			}
			
			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Log.d("string request error linstener", arg0.getMessage() + "");
			}
		};
        
		TextRequest baiduRequest = new TextRequest(Method.GET, callBack);
		
		mRequestQueue.add(baiduRequest);

感觉这个activity的代码可读性会提高不少。



后记:

1,因为才开始尝试自己写,没什么经验,所以还是觉得写得不是很好,特别是callBack的抽象类。希望有更好 的建议

  2,在官方的Request之类中也有很多不同类型的子类,例如jsonOBJ之类的,因为Request<T>是泛型,我们在 建立AbsRequest的子类时,也可以利用这一点,建立独特返回类型的子类。只要在重载 parseNetworkResponse时做不同的处理就可以了。

  3,还是那句,刚刚起步,期待提高。









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Android网络框架封装,有许多不同的选择。以下是一些常见的网络框架封装方法: 1. VolleyVolley是Google推出的用于Android应用程序的网络通信库。它使用简单且易于集成,具有高效的网络请求队列和缓存机制。你可以封装Volley以满足你的特定需求,例如添加身份验证、错误处理或数据解析等功能。 2. OkHttp:OkHttp是一个开源的HTTP客户端库,可用于Android应用程序中的网络通信。它提供了简单易用的API,支持同步和异步请求,并具有连接池和缓存等功能。你可以使用OkHttp封装网络请求,自定义拦截器和事件监听器,以及处理各类错误和异常情况。 3. Retrofit:Retrofit是Square公司开发的一个类型安全的RESTful网络请求库。它基于OkHttp,并提供了简洁的注解接口来定义API请求。你可以封装Retrofit以定义你的API接口和请求参数,并处理响应结果、错误情况和数据解析等。 4. 自定义封装:除了使用现有的网络框架,你还可以根据你的需求自定义封装一个网络库。这种方式可以灵活地满足特定的业务需求。你可以使用Java的URLConnection或Apache HttpClient等原生库进行底层网络通信,并自定义请求、解析和错误处理等逻辑。 在封装网络框架时,你可以考虑以下几点: - 封装请求方法(GET、POST等)和参数(URL、请求头、请求体等)的接口。 - 统一处理错误和异常情况,例如网络连接失败、超时、服务器错误等。 - 可选地处理数据解析和转换,例如使用Gson库将JSON数据转换为Java对象。 - 支持并发请求和线程管理,以避免阻塞主线程。 - 可选地添加缓存机制,以减少重复请求和提高性能。 - 可选地添加身份验证和安全机制,以保护数据的传输和存储安全。 以上是一些常见的Android网络框架封装方法,你可以根据具体需求选择适合你项目的框架或自定义封装

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值