欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

okhttp对中callBack扩展使onError或onResponse能返回更多响应信息

程序员文章站 2022-07-12 15:31:11
...

app端经常遇到这样的需求:弹出一个Toast显示服务端的提示信息,比如:“用户名已经被注册”。

方法一:

public abstract class CommonCallback<T> extends Callback {

    private Type type;

    public CommonCallback() {
        Class<? extends CommonCallback> clazz = getClass();
        Type genericSuperclass = clazz.getGenericSuperclass();

        if (genericSuperclass instanceof Class) {
            throw new RuntimeException("没有写泛型");
        }
        ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
        type = parameterizedType.getActualTypeArguments()[0];
    }

    @Override
    public void onError(Call call, Exception e, int id) {
        onError(e);
    }

    @Override
    public void onResponse(String response, int id) {
        try {
            JSONObject resp = new JSONObject(response);
            int resultCode = resp.getInt("resultCode");

            if (resultCode == 1) {
                String data = resp.getString("data");
                onResponse((T) GsonUtil.getGson().fromJson(data, type));
            } else {
                onError(new Exception(resp.getString("resultMessage")));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    /**
     * 返回true使得所有请求,无论response code为多少都当做响应成功,交给onResponse方法处理,
     * 便于不同错误响应的返回
     * @param response
     * @param id
     * @return
     */
    @Override
    public boolean validateReponse(Response response, int id) {
        return true;
    }

    @Override
    public String parseNetworkResponse(Response response, int id) throws IOException {
        return response.body().string();
    }

    public abstract void onError(Exception e);

    public abstract void onResponse(T response);
}

此方法通过将validateResponse方法返回值设置为true,使得所有的response(无论response code为多少)都能通过检测,被onResponse接收到,然后在外部逻辑传入回调函数时实现onResponse和onError方法(最后两个抽象方法),可以*处理所有返回信息。此方法适用于项目自己定义了resultCode和resultMessage的情况,由服务端返回这些信息,然后客户端在onResponse中直接显示。

方法二:

public abstract class MyStringCallback extends Callback<string> {
    @Override
    public boolean validateReponse(Response response, int id) {
        return true;
    }
 
    @Override
    public String parseNetworkResponse(Response response, int id) throws Exception {
 
        if(response.code()>=200 && response.code()<300){
            return response.body().string();
        }else{
            throw new Exception("code is:"+response.code()+"\n"+response.body().string());
        }
 
    }
 
}

此方法仍然进行了响应的过滤(虽然validateResponse返回true,但是在之后的parseNetworkResponse方法中进行了筛选)——response code在200到300之间的响应被onResponse接收,其余响应被onError接收。唯一增添的灵活性就是可以自己添加Error的错误信息(见代码段else中)。