上一篇文章:Retrofit框架学习(一)
上一篇文章简单介绍了,retrofit框架的使用,创建一个interface,在创建一个Retrofit对象访问。
网络访问,我们在做项目的时候一般都会封装成好用的接口,retrofit当然已经封装的很简单了,不过我想让
网络访问与ui的相关代码分开,单独提炼出一个类来,用retrofit访问网络,我会这么封装。
假设服务器返回的json数据格式是这样的
{
"code":1,
"data":{},
"message":""
}
伴随返回message数据,message里是错误信息。
因为data中的数据不是固定格式,不同接口返回的数据并不一样,所以不能定义成固定的类,而我则
写成了泛型。
public class HttpResult<T> {
/**
* code : 1
* data : {}
* message :
*/
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
那么,我们具体接口怎么访问呢,比如我这里有一个登录接口,访问时,需要上传参数account, password
返回的数据data中是
{
"username":"",
"img":""
}
我根据返回的数据,又创建了这个类
public class UserData {
/**
* username :
* img :
*/
private String username;
private String img;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
}
接下来,我来封装一个网络访问的接口
public void init() {
retrofit = new Retrofit.Builder()
.baseUrl("http://baseurl")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
private <T> void getResult(final Call<HttpResult<T>> call, final IHttpCallback<T> callback) {
call.enqueue(new Callback<HttpResult<T>>() {
@Override
public void onResponse(Call<HttpResult<T>> call, Response<HttpResult<T>> response) {
if (response.body().getCode() == 1) {
callback.success(response.body().getData());
} else {
callback.failed(response.body().getMessage());
}
}
@Override
public void onFailure(Call<HttpResult<T>> call, Throwable t) {
//connect to server failure
callback.connectFailure(t);
}
});
}
public void login(final String account, final String password, final IHttpCallback<UserData> callback) {
ILoginService loginService = retrofit.create(ILoginService.class);
Call<HttpResult<UserData>> call = loginService.login(account, password);
getResult(call, callback);
}
如果添加接口的话
添加
public void getNewsList(final int page, final int number, final IHttpCallback<NewsList> callback) {
INewsService newsService = retrofit.create(INewsService.class);
Call<HttpResult<NewsList>> call = newsService.getNewsList(page, number);
getResult(call, callback);
}
这样就可以了,当然接口的interface和解析的实体类,还是需要自己创建的
文中示例下载