Volley的使用

漩涡敏人 2015-02-09

一:volley在android2.3之前使用的是HttpClient进行联网,在2.3及以上版本使用的是HttpUrlConnection联网方式;

android新的网络通信库,更快更稳定;适用于通信数据量不大,但是非常频繁的情景;

二:volley提供的功能:

JSON,图像等的异步下载;

网络请求的排序(scheduling)

网络请求的优先级处理

缓存

多级别取消请求

和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

三:适用volley的NetworkImageView

Volley提供了一个新的控件NetworkImageView来代替传统的ImageView,这个控件的图片属性可以通过

mImageView.setImageUrl(url,imageLoader)

来设定。而且,这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。

四:适用自定制的request

我们也可以通过继承Request根据自己的需求来定制自己的request

@Override

protectedResponseparseNetworkResponse(NetworkResponseresponse){

try{

Stringjson=newString(

response.data,HttpHeaderParser.parseCharset(response.headers));

returnResponse.success(

gson.fromJson(json,clazz),HttpHeaderParser.parseCacheHeaders(response));

}catch(UnsupportedEncodingExceptione){

returnResponse.error(newParseError(e));

}catch(JsonSyntaxExceptione){

returnResponse.error(newParseError(e));

}

}

里面使用的gson(com.google.gson.Gson)是JSON的序列化和反序列化的库,可以在JSON和javamodelobject之间进行转换。

以下是使用自定制request的例子:

mRequestQueue.add(newGsonRequest(url,ListResponse.class,null,

newListener(){

publicvoidonResponse(ListResponseresponse){

appendItemsToList(response.item);

notifyDataSetChanged();

}

}

}

五:volley使用示例:

1.创建自己的request继承自Volley的request,实现相应的方法,设置请求信息和请求成功回调接口;

publicclassVolleyRequestextendsRequest<NetworkResponse>{

privatefinalListener<NetworkResponse>mListener;

privatebyte[]mRequestBytes;

privateMap<String,String>mHeaders;

/**

*初始化请求

*

*@parammethod

*请求类型

*@paramurl

*请求地址

*@paramlistener

*成功回调

*@paramerrorListener

*失败回调

*

**/

publicVolleyRequest(intmethod,Stringurl,

Listener<NetworkResponse>listener,

Response.ErrorListenererrorListener){

super(method,url,errorListener);

mListener=listener;

}

@Override

protectedvoiddeliverResponse(NetworkResponseresponse){

mListener.onResponse(response);

}

@Override

protectedResponse<NetworkResponse>parseNetworkResponse(

NetworkResponseresponse){

returnResponse.success(response,

HttpHeaderParser.parseCacheHeaders(response));

}

publicvoidsetRequestBytes(byte[]pRequestBytes){

this.mRequestBytes=pRequestBytes;

}

@Override

publicbyte[]getBody()throwsAuthFailureError{

returnmRequestBytes;

}

publicvoidsetHeaders(Map<String,String>pHeaders){

this.mHeaders=pHeaders;

}

@Override

publicMap<String,String>getHeaders()throwsAuthFailureError{

if(mHeaders!=null&&mHeaders.size()>0)

returnmHeaders;

returnCollections.emptyMap();

}

}

2.创建一个外部调用Volley的接口,该接口提供创建自定义request以及对应回调接口的方法:

publicclassVolleyConnection{

privateContextmContext;

privateStringmUrl;

privatebyte[]mRequestBytes;

privateIHttpCallbackmHttpCallback;

privateintMETHOD;

/**

*判断同步方式HTTPPOST或GET

*

*@paramaUrl

*服务器地址

*@paramaRequestBytes

*POST到服务器的数据。

*@paramaCallBack

*回调接口。

*

**/

publicVolleyConnection(ContextaContext,StringaUrl,

byte[]aRequestBytes,IHttpCallbackaCallBack){

mContext=aContext;

mUrl=aUrl;

mRequestBytes=aRequestBytes;

mHttpCallback=aCallBack;

if(mRequestBytes==null||mRequestBytes.length==0)

METHOD=Request.Method.GET;

else

METHOD=Request.Method.POST;

}

privateListener<NetworkResponse>getResponseListener(){

returnnewResponse.Listener<NetworkResponse>(){

@Override

publicvoidonResponse(NetworkResponseresponse){

if(mHttpCallback!=null){

mHttpCallback.onCompleted(response.statusCode,

response.data);

}

}

};

}

privateErrorListenergetErrorListener(){

returnnewResponse.ErrorListener(){

@Override

publicvoidonErrorResponse(VolleyErrorerror){

if(mHttpCallback!=null){

mHttpCallback.onException(error);

}

}

};

}

publicvoidconnect(){

VolleyRequestrequest=newVolleyRequest(METHOD,mUrl,

getResponseListener(),getErrorListener());

//if(BasicAuthorUtil.isBasicAuthor(mUrl)){

Map<String,String>headers=newHashMap<String,String>();

headers.put(

"Authorization",

"Basic"

+newString(Base64.encodeBase64("flsyjh:flSYjhx2012"

.getBytes())));

request.setHeaders(headers);

//}

request.setRequestBytes(mRequestBytes);

VolleyConnectionManager.addRequest(request,mContext);

}

}

3.提供一个Manager对象,该对象提供一个全局静态变量RequestQueue,并在应用启动时初始化该队列,并在内部封装添加自定义request和提供自定义request的接口;外部接口进行联网时每次创建一个requst然后放到requestQueue列表;

publicclassVolleyConnectionManager{

privatestaticRequestQueuemRequestQueue;

publicstaticvoidinit(Contextcontext){

mRequestQueue=Volley.newRequestQueue(context);

}

publicstaticRequestQueuegetRequestQueue(){

if(mRequestQueue!=null){

returnmRequestQueue;

}else{

thrownewIllegalStateException("RequestQueuenotinitialized");

}

}

publicstaticvoidaddRequest(Request<?>request,Objecttag){

if(tag!=null){

request.setTag(tag);

}

mRequestQueue.add(request);

}

publicstaticvoidcancelAll(Objecttag){

mRequestQueue.cancelAll(tag);

}

}

相关推荐

狂草 / 0评论 2015-08-18

狂草 / 0评论 2014-12-06