您的位置:首页 > 理论基础 > 计算机网络

android网络框架Retrofit 同步异步

2015-11-03 16:35 549 查看
http://blog.csdn.net/jiguangcanhen/article/details/39006197

同步的方式:

1)首先定义要接口。注解Get表示使用的Get请求方式,{user}代表要被替换的数据

publicinterfaceGitHubService{

@GET("/users/{user}/repos")

List<Repo>listRepos(@Path("user")Stringuser);

}

2)初始化RestAdapter,并利用动态代理来创建的接口对象。

RestAdapterrestAdapter=newRestAdapter.Builder()

.setEndpoint("https://api.github.com")

.build();

GitHubServiceservice=restAdapter.create(GitHubService.class);

3)使用网络访问并返回

List<Repo>repos=service.listRepos("octocat");

异步的方式:

@POST("/users/new")

voidcreateUser(@BodyUseruser,Callback<User>cb);

注:body注解,在进行请求前对象会被转换器进行相应的数据转换。

前两部和之前的相同,不同在于最后一个参数变成了CallBack对象。

controller.getLogin(mail,password,newCallback<UserDataModel>(){

@Override

publicvoidfailure(RetrofitErrorerror){

//TODOAuto-generatedmethodstub

}

@Override

publicvoidsuccess(UserDataModelldm,Responseresponse){

//TODOAuto-generatedmethodstub

});

可以看到当请求网络返回之后,会在failure中和success中进行回调,而且默认的数据转换器会把相应的json字符串转换为对象。(当然,我们也可以定义自己的数据转换器)

定义自己的数据转换器:

publicclassMyConverterimplementsConverter{

@Override

publicObjectfromBody(TypedInputbody,Typetype)throwsConversionException{

StringBufferresult=newStringBuffer();

try{

InputStreamis=body.in();

byte[]buffer=newbyte[1024];

while(is.read(buffer)!=-1){

result.append(newString(buffer,"UTF-8"));

}

}catch(IOExceptione){

e.printStackTrace();

}

returnresult;

}

@Override

publicTypedOutputtoBody(Objectobject){

returnnull;

}

}

上面的自定义数据转换器,会在请求成功之后,返回给我们字符串,而不是相应的被gson转换过格式的字符串。

RestAdapterrestAdapter=newRestAdapter.Builder()

.setEndpoint(“url”)

.setConverter(newMyConverter())

.build();

在创建RestAdapter之后创建设置使用自己的数据转换器就可以了。

我们还可以灵活的进行其他的配置:

1)设置请求拦截器,会在请求发出前,进行拦截

RequestInterceptorrequestInterceptor=newRequestInterceptor(){

@Override

publicvoidintercept(RequestFacaderequest){

request.addHeader("User-Agent","Retrofit-Sample-App");

}

};


RestAdapterrestAdapter=newRestAdapter.Builder()

.setEndpoint("https://api.github.com")

.setRequestInterceptor(requestInterceptor)

.build();

2)设置错误控制器

classMyErrorHandlerimplementsErrorHandler{

@OverridepublicThrowablehandleError(RetrofitErrorcause){

Responser=cause.getResponse();

if(r!=null&&r.getStatus()==401){

returnnewUnauthorizedException(cause);

}

returncause;

}

}


RestAdapterrestAdapter=newRestAdapter.Builder()

.setEndpoint("https://api.github.com")

.setErrorHandler(newMyErrorHandler())

.build();

3)设置log日志。

RestAdapterrestAdapter=newRestAdapter.Builder()

.setLogLevel(RestAdapter.LogLevel.FULL)

.setEndpoint("https://api.github.com")

.build();

上面只是简单介绍了它的使用,其实它还有很多的功能,Get,Post,Put,Delete,Head……具体请参见官方网址。

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: