如何优雅的快速搭建MVVM项目

MVVMFramework系列教程(二)

Posted by Sai on August 30, 2016

上一章讲到BaseViewModel中几个状态,而通常这几个状态都是根据网络返回情况来判断的,建立一个基类写一个通用的网络回调的话,就能把各种状态设置好,不用在每个具体实现的类里重复去设置了。

Retrofit

网络库集成了Retrofit,我们通过继承Retrofit的Callback来实现自己的HttpServiceCallBack抽象类,在HttpServiceCallBack 里面定义onHttpSuccess,onHttpFail,onNetWorkError,onHttpComplete,在具体实现中设置对应的状态。

public abstract class HttpServiceCallBack<T> implements Callback<HttpResult<T>> {
    @Override
    public void onResponse(Call<HttpResult<T>> call, Response<HttpResult<T>> response) {

        HttpResult<T> result = response.body();

        if (result == null) {
            //通常是服务器出错返回了非约定格式
            onHttpFail(response.code(),"网络错误,请稍后再试");
        } else {
            if (result.getCode() == HttpStatusConstants.RESULT_OK) {
                //正确返回约定的OK码
                onHttpSuccess(result.getContent(),result.getMsg());
            }
            else {
                //返回约定的其他类型码,可根据返回码进行相对应的操作
                onHttpFail(result.getCode(),result.getMsg());
            }
        }
        onHttpComplete();
    }

    @Override
    public void onFailure(Call<HttpResult<T>> call, Throwable t) {
        //网络异常或json解析失败
        onNetWorkError();
        onHttpComplete();
    }

    public abstract void onHttpSuccess(T resultData,String msg);
    public abstract void onHttpFail(int code, String msg);
    public abstract void onNetWorkError();
    public abstract void onHttpComplete();
}

上面HttpResult是接口对应统一返回格式

//content里面是json格式代表详情
{"code":0,"msg":"获取详情成功","content":{"productId":"1200001","spotName":"门票名称"}}
//或者content里面是jsonArray格式代表列表
{"code":0,"msg":"获取详情成功","content":[{"productId":"1200001","spotName":"门票名称1"},{"productId":"1200002","spotName":"门票名称2"}]}

具体请求数据请去看Retrofit的用法,相信大部分人都已经在用Retrofit了,在这里不做太多解释。 > 通过上面自定义的HttpServiceCallBack,我们可以很轻松的去做断点查看数据,因为我们之后所有的网络请求返回结果都是通过HttpServiceCallBack。

Github

MVVMFramework