版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中对volley进行封装
本篇文章给大家分享的是有关怎么在Android中对volley进行封装,在下觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着在下一起来看看吧。public
void
get()
{
String
url
=
"/cc/json/mobile_tel_segment.htm?tel=";
StringRequest
request
=
new
StringRequest(Request.Method.GET,
url,
new
Response.Listener<String>()
{
@Override
public
void
onResponse(String
s)
{
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
},
new
Response.ErrorListener()
{
@Override
public
void
onErrorResponse(VolleyError
volleyError)
{
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
request.setTag("abcGet");
MyApplication.getHttpQueues().add(request);
}首先看一下我封装后的使用例子:
private
void
initData()
{
NewsApi.getInfo(new
NetCallback<News>()
{
@Override
public
void
OnSuccess(final
News
result)
{
mAdapter.setData(result.getResult().getData());
}
@Override
public
void
OnError(RestfulError
error)
{
}
});
}有没有看起来很舒服的感觉。好吧,让我开始盘它吧!1.首先我先去写了一个基类,用来创建一个新的request并把它加入到volley内部封装的请求队列中,代码如下:public
abstract
class
AuthenticatedRequestBase<T>
extends
Request<T>
{
private
final
static
String
TAG
=
"AuthenticatedRequestBase";
private
static
final
int
TIME_OUT
=
30000;
private
static
final
int
MAX_RETRIES
=
1;
private
static
final
float
BACKOFF_MULT
=
2f;
protected
Context
mContext;
protected
RequestQueue
mRequestQueue;
/**
*
创建新的请求,并把请求加入到请求队列requestQueue中
*
*
@param
method
*
@param
url
*
@param
cache
*
@param
errorListener
*/
@SuppressLint("LongLogTag")
public
AuthenticatedRequestBase(int
method,
String
url,
boolean
cache,
Response.ErrorListener
errorListener)
{
super(method,
url,
errorListener);
//this.setShouldCache(cache);
this.setRetryPolicy(new
DefaultRetryPolicy(
TIME_OUT,
MAX_RETRIES,
BACKOFF_MULT));
mRequestQueue
=
YZ.getInstance().getRequestQueue();
if
(mRequestQueue
==
null)
{
throw
new
IllegalArgumentException("mRequestQueue
can't
be
null");
}
mContext
=
YZ.getInstance().getContext();
if
(mContext
==
null)
{
throw
new
IllegalArgumentException("mContext
can't
be
null");
}
//如果重新发出服务器请求的时候,需要清除之前的缓存。
if
(!cache)
{
Cache
volleyCache
=
mRequestQueue.getCache();
Cache.Entry
cacheEntry
=
volleyCache.get(url);
if
(cacheEntry
!=
null)
{
volleyCache.remove(url);
Log.d(TAG,
"remove
volley
cache:"
+
url);
}
}
mRequestQueue.add(this);
}
/**
*
重写这个方法,可以在http请求头里面加入token,客户端能接受的数据类型
*
*
@return
*
@throws
AuthFailureError
*/
@CallSuper
@Override
public
Map<String,
String>
getHeaders()
throws
AuthFailureError
{
Map<String,
String>
headers
=
new
HashMap<>();
String
token
=
"";
//headers.put("Authorization",
"bearer
"
+
token);
//针对Get方法,申明接受的enum类型
//
headers.put("Accept",
"charset=utf-8");
return
headers;
}
/**
*
网络错误问题统一处理
*
*
@param
volleyError
*
@return
*/
@CallSuper
@Override
protected
VolleyError
parseNetworkError(VolleyError
volleyError)
{
return
super.parseNetworkError(volleyError);
}
}代码注释比较清晰,就不在赘述。2.以get方法为例,新建一个GetRequest去继承这个基类,并出解析结果:public
class
GetRequest<TResponse>
extends
AuthenticatedRequestBase<TResponse>
{
private
final
Response.Listener<TResponse>
listener;
private
final
Class<TResponse>
clazz;
private
final
static
String
TAG
=
"GetRequest";
private
String
mUrl;
private
NetCallback<TResponse>
cb;
private
boolean
cacheHit;
public
GetRequest(String
url,
Class<TResponse>
clazz,
boolean
cache,
NetCallback<TResponse>
callback)
{
super(Request.Method.GET,
url,
cache,
callback.getErrorListener());
this.listener
=
callback.getSuccessListener();
this.clazz
=
clazz;
this.mUrl
=
url;
this.cb
=
callback;
//无网络时300ms后返回callback
if
(!NetUtils.isConnect(mContext)
&&
mRequestQueue.getCache().get(url)
==
null)
{
Handler
handler
=
new
Handler();
handler.postDelayed(new
Runnable()
{
@Override
public
void
run()
{
cb.OnNetworkOff();
}
},
300);
}
}
/**
*
这个是缓存的标记,与本地缓存相关
*
@param
tag
*/
@Override
public
void
addMarker(String
tag)
{
super.addMarker(tag);
cacheHit
=
tag.equals("cache-hit");
}
@Override
protected
Response<TResponse>
parseNetworkResponse(NetworkResponse
response)
{
Gson
gson
=
new
Gson();
//无网络时,使用本地缓存,通过url去匹配缓存,volley
sdk是通过url创建不同的文件来实现缓存的
if
(!NetUtils.isConnect(mContext)
&&
mRequestQueue.getCache().get(mUrl)
!=
null)
{
String
json
=
new
String(mRequestQueue.getCache().get(mUrl).data);
Log.d(TAG,
"url=="
+
mUrl
+
",json"
+
json);
cb.fResponseCacheStatus
=
ResponseCacheStatus.StaleFromCache;
return
Response.success(gson.fromJson(json,
clazz),
parseCacheHeaders(response));
}
//数据是否有更新
try
{
if
(response.statusCode
==
304)
{
//服务端返回缓存数据
cb.fResponseCacheStatus
=
ResponseCacheStatus.NotModifiedFromServer;
}
else
if
(response.statusCode
==
200)
{
if
(cacheHit)
{
//使用本地缓存
cb.fResponseCacheStatus
=
ResponseCacheStatus.FreshFromCache;
}
else
{
//使用服务端更新数据
cb.fResponseCacheStatus
=
ResponseCacheStatus.NewFromServer;
}
}
else
{
cb.fResponseCacheStatus
=
ResponseCacheStatus.NewFromServer;
}
Log.d(TAG,
"fResponseCacheStatus
=
"
+
cb.fResponseCacheStatus);
String
json
=
new
String(response.data,
parseCharset(response.headers));
return
Response.success(gson.fromJson(json,
clazz),
parseCacheHeaders(response));
}
catch
(UnsupportedEncodingException
|
JsonSyntaxException
e)
{
return
Response.error(new
ParseError(e));
}
}
@Override
protected
void
deliverResponse(TResponse
response)
{
listener.onResponse(response);
}
@Override
protected
VolleyError
parseNetworkError(VolleyError
volleyError)
{
return
super.parseNetworkError(volleyError);
}
}3.上面只做了返回成功的处理方式,返回失败时由NetCallback内部统一处理:@UiThread
public
abstract
class
NetCallback<TResponse>
{
public
ResponseCacheStatus
fResponseCacheStatus
=
ResponseCacheStatus.NewFromServer;
private
String
TAG
=
this.getClass().getSimpleName();
public
boolean
enableAutomaticToastOnError
=
true;
public
NetCallback()
{
}
public
NetCallback(boolean
enableAutomaticToastOnError)
{
this.enableAutomaticToastOnError
=
enableAutomaticToastOnError;
}
public
abstract
void
OnSuccess(TResponse
result);
public
abstract
void
OnError(RestfulError
error);
public
void
OnNetworkOff()
{
//do
nothing
,use
it
according
to
requirement
}
public
Response.Listener<TResponse>
getSuccessListener()
{
return
new
Response.Listener<TResponse>()
{
@Override
public
void
onResponse(TResponse
result)
{
OnSuccess(result);
}
};
}
public
Response.ErrorListener
getErrorListener()
{
return
new
Response.ErrorListener()
{
@Override
public
void
onErrorResponse(VolleyError
volleyError)
{
if
(volleyError
instanceof
TimeoutError)
{
Log.e(TAG,
"networkResponse
==
null");
//volley
TimeoutError
OnError(new
RestfulError());
}
if
(volleyEworkResponse
!=
null)
{
int
statusCode
=
volleyEworkResponse.statusCode;
String
errorMessage
=
new
String(volleyEworkResponse.data);
switch
(statusCode)
{
case
401:
//post
a
Permission
authentication
failed
event
break;
default:
Log.d(TAG,
"errorMessage
="
+
errorMessage);
try
{
RestfulError
error
=
new
Gson().fromJson(errorMessage,
RestfulError.class);
if
(enableAutomaticToastOnError
&&
error.getCode()
!=
null)
{
//toast(error.ExceptionMessage);
//toast
it
in
main
thread
}
OnError(error);
}
catch
(Exception
e)
{
OnError(new
RestfulError());
Log.d(TAG,
"e
="
+
e.toString());
}
break;
}
}
}
};
}
}4.注意到没有,在AuthenticatedRequestBase内部有一个环境类YZ,主要负责获取项目主程序中的context和请求队列:public
class
YZ
implements
AppRequestQueue
{
private
static
final
int
DEFAULT_VOLLEY_CACHE_SIZE
=
100
*
1024
*
1024;
private
Context
context;
private
int
cacheSize;
private
YZ()
{
}
@Override
public
RequestQueue
getRequestQueue()
{
return
Volley.newRequestQueue(context,
cacheSize);
}
public
Context
getContext()
{
return
context;
}
private
static
class
SingletonHolder
{
private
static
YZ
instance
=
new
YZ();
}
public
static
YZ
getInstance()
{
return
SingletonHolder.instance;
}
/**
*
need
a
app
context
*
*
@param
appContext
*/
public
void
init(final
Context
appContext)
{
init(appContext,
DEFAULT_VOLLEY_CACHE_SIZE);
}
/**
*
@param
appContext
*
@param
cacheSize
*/
pub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度保健品产品责任保险合同
- 广州装修工程施工合同范例
- 工程监理合同范本模板
- 合同项下权益保障
- 技术合同范本-合伙型联营协议
- 个人借款合同样式汇编
- 带担保人借款的合同范例
- 2024年度环保厕所生产与销售合同
- 2024年度版权运用合同
- 2024年度智慧城市建设与运维服务合同
- GB/T 31422-2015个体防护装备护听器的通用技术条件
- GB/T 11270.1-2021超硬磨料制品金刚石圆锯片第1部分:焊接锯片
- 电梯安全隐患整改台帐(物业管理)
- 小学生安全急救常识培训课件
- 商业计划书的撰写培训课件
- 肝内胆管细胞癌-并茂课件
- 远离校园欺凌 课件 心理健康-通用版
- 《格林童话》名著导读读书分享PPT
- 某某商会某某专业委员会管理办法
- 人教版小学一年级美术上册全册课件
- 碳酸二甲酯安全技术说明书(msds)
评论
0/150
提交评论