【移动应用开发技术】怎么在Android中对volley进行封装_第1页
【移动应用开发技术】怎么在Android中对volley进行封装_第2页
【移动应用开发技术】怎么在Android中对volley进行封装_第3页
【移动应用开发技术】怎么在Android中对volley进行封装_第4页
【移动应用开发技术】怎么在Android中对volley进行封装_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论