Retrofit使用泛型封装返回数据
2016-12-13 本文已影响2501人
Android埋坑的艺术
Retrofit使用泛型封装返回数据
当前现状
如果服务器返回的数据是这样的
//登录
{
"code": 0,
"data": {
"id": "123456",
"token": "test_test_test"
},
"message": "登录成功"
}
//获取用户信息
{
"code": 0,
"data": {
"avatarUrl": "www.xpc.com/avatar/8888.jpg"
"gender": 1,
"phone": "15882261838",
"realName": "xp.c"
},
"message": "获取用户信息成功"
}
上面两个列子可以看出,返回数据中都带有错误码
code
和message
两个字段,通常的做法是建立两个POJO类,接口少还好说,但是接口多了,就会做非常多的重复体力劳动
解决方案
使用泛型
我们把公共数据先抽出来,然后data
变化的数据用泛型表示
public class Result<T> {
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public T getData() {
return data;
}
}
这样我们就将
code
和message
两个字段剥离,变化的就是data
//POJO类定义
public class UserInfo{
private String realName;
private String avatarUrl;
private int gender;
private String phone;
public String getRealName() {
return realName;
}
public String getAvatarUrl() {
return avatarUrl;
}
public int getGender() {
return gender;
}
public String getPhone() {
return phone;
}
}
UserInfo已将
code
和message
两个字段剥离
interface定义
public interface IAuthService {
@POST("user/getUserInfo")
Observable<Result<UserInfo>> getUserInfo();
}
java使用
public void getUserInfo() {
mAuthService.getUserInfo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Result<UserInfo>>() {
@Override
public void onCompleted() {
//...
}
@Override
public void onError(Throwable e) {
//...
}
@Override
public void onNext(Result<UserInfo> result) {
if (result.getCode() == 0){
UserInfo userInfo = result.getData();
//...
}else {
//...
}
}
});
}