Retrofit+Okhttp的数据和回调封装

BaseModel:

服务器的统一回调接口为以下格式:

{
  "code:":"",
  "msg:"",
  "content":
      {
         ....
      }
}

首先我们要确定好需要的数据

  1. code状态码和msg信息是必须的
  2. 对于部分post请求的接口,我们只需要知道状态码,然后根据状态码去判断相应的逻辑,并弹出相应的信息,并不需要content的内容;
  3. get请求需要获取content内容,并可以通过常用的GsonConverterFactoryScalarsConverterFactory转换器封装成我们需要的对象数据。
  4. 状态码的不同:
  • 0 - 请求成功
  • 1 - 请求失败
  • 6 - 登录过期
  • 。。。。等其他状态
    根据我们的需要封装了下面的model
public class BaseModel<T> implements Serializable {
    private String msg;
    private String code;
    private T content;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }

    /**
     * 判断网络请求是否成功
     *
     * @return boolean
     */
    public boolean isSuccess() {
        return code.equals("0");
    }

    /**
     * 判断登录是否过期
     *
     * @return boolean
     */
    public boolean isOverDue() {
        return code.equals("6");
    }
}

自定义回调

public abstract class BaseAction<T> implements Action1<BaseModel<T>> {
    @Override
    public void call(BaseModel<T> tBaseModel) {
        if (tBaseModel.isSuccess()) {//请求成功
            onSuc(tBaseModel.getMsg(), tBaseModel.getContent());
        } else if (tBaseModel.isOverDue()) {//登录过期
            EventBus.getDefault().post(EventBusEvent.TOKEN_EVENT);
        } else {//请求失败
            onFail(tBaseModel.getMsg());
        }
    }
    protected abstract void onSuc(String msg, T content);
    protected abstract void onFail(String msg);
}

需要说明的登录过期回调中,引用了AndroidEventBus

简单的请求

 String user_id = App.getInstance().getUserId();
 String autograph = App.getInstance().getSignToken();
 RetrofitHelper.deviceApi().devList(user_id, autograph)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new BaseAction<DeviceListBean>() {
                    @Override
                    protected void onSuc(String msg, DeviceListBean content) {
                        mRecyclerView.refreshComplete(0);
                        mDeviceListBeen = content.getDev_list();
                        if (mDeviceListBeen != null && mDeviceListBeen.size() > 0) {
                            mLayoutEmpty.setVisibility(View.GONE);
                        } else {
                            mLayoutEmpty.setVisibility(View.VISIBLE);
                        }
                        mDeviceListAdapter.setDataList(mDeviceListBeen);
                    }

                    @Override
                    public void onFail(String msg) {
                        ToastUtil.showShort(mContext, msg);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {

                    }
                });

这样每次请求的回调就清爽多了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,670评论 25 709
  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 10,526评论 0 12
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 14,745评论 0 15
  • 你是天上的云朵 我是地面的湖泊 你偶然从我的头顶飘过 倩影深深印在了我的心窝 从那以后 我便迷失了自我 幻想也是一...
    梦依寒烟醉阅读 2,985评论 0 0
  • 大声说不,对于自己不喜欢不想面对的事情,大声说不,自己曾经不愿意做一件事情,可是有人非得逼着做这种事情,所以就一各...
    百合花中哥哥阅读 2,726评论 0 1