漩涡敏人 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);
}
}