Retrofit使用泛型封装返回数据

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 {

    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> getUserInfo();
    
}

java使用

    public void getUserInfo() {
        mAuthService.getUserInfo()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer>() {
                    @Override
                    public void onCompleted() {
                        //...
                    }

                    @Override
                    public void onError(Throwable e) {
                        //...
                    }

                    @Override
                    public void onNext(Result result) {
                        if (result.getCode() == 0){
                            UserInfo userInfo = result.getData();
                            //...
                        }else {
                            //...
                        }
                    }
                });
    }

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

Retrofit使用泛型封装返回数据_第1张图片
qrcode_xp.jpg

你可能感兴趣的:(Retrofit使用泛型封装返回数据)