Retrofit框架学习(二)

上一篇文章:Retrofit框架学习(一)

上一篇文章简单介绍了,retrofit框架的使用,创建一个interface,在创建一个Retrofit对象访问。


网络访问,我们在做项目的时候一般都会封装成好用的接口,retrofit当然已经封装的很简单了,不过我想让

网络访问与ui的相关代码分开,单独提炼出一个类来,用retrofit访问网络,我会这么封装。


假设服务器返回的json数据格式是这样的 

{
"code":1,
"data":{},
"message":""
}



code参数表示,服务器的处理结果,1为正确,其他为错误,正确是会伴随返回data数据,错误时会

伴随返回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和解析的实体类,还是需要自己创建的


文中示例下载





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LO嘉嘉VE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值