美文网首页Rx系列Retrofit 2.0安卓技巧
Retrofit使用泛型封装返回数据

Retrofit使用泛型封装返回数据

作者: Android埋坑的艺术 | 来源:发表于2016-12-13 01:16 被阅读2501次

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": "获取用户信息成功"
}

上面两个列子可以看出,返回数据中都带有错误码codemessage两个字段,通常的做法是建立两个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;
    }
}

这样我们就将codemessage两个字段剥离,变化的就是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已将codemessage两个字段剥离

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 {
                            //...
                        }
                    }
                });
    }

欢迎关注我的微信公众号(Android埋坑的艺术),一手新鲜,不容错过

qrcode_xp.jpg

相关文章

网友评论

  • 程序猿小金:public interface IAuthService {

    @POST("user/getUserInfo")
    Observable<Result<UserInfo>> getUserInfo();

    }

    这里的 @POST("user/getUserInfo")
    Observable<Result<UserInfo>> getUserInfo();可以用 @POST("user/getUserInfo")
    Observable<Result<T>> getUserInfo();这样写吗?
    如果可以这样的话,怎么写的..
  • NEWBIE_7869:如果对象返回null如何处理
  • PiNoLa:我试了也是 泛型不能返回数据。。可能就是泛型擦除问题
    Android埋坑的艺术:会不会是你们的data是个复杂对象,里面还嵌套有json对象,而你把那个json定义成了一个简单的String
  • 2b3fa3a63231:是否遇到泛型擦除的问题,返回数据不能转换成对象,而是linkedHashmap报错?
    Android埋坑的艺术: @2b3fa3a63231 是不是你的对象和服务器返回的Json不匹配

本文标题:Retrofit使用泛型封装返回数据

本文链接:https://www.haomeiwen.com/subject/ppyvmttx.html