对OkHttpUtils中onError方法进行扩展打印更多信息

来源:互联网 发布:echarts清除缓存数据 编辑:程序博客网 时间:2024/06/17 21:45

弥补OkHttpUtils中onError方法打印错误信息的不足

最近开发Android项目用到了OkHttpUtils,项目中的服务器是另一个同学搭的,能测试服务器的接口的只有我了,比如400,500错误啊,都要我这边打印才能找到出错具体在哪个代码块,但是,OkHttpUtils的错误信息居然只有打印出响应码,这真是让人很无语啊。然后就花时间研究起背后的故事。。。

先附上OkHttpUtils的作者和用法:Android 一个改善的okHttp封装库

首先看一下普通返回的String类型的StringCallback

OkHttpUtils.get()                .url(url)                .build()                .execute(new StringCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        e.printStackTrace();                        Log.i(TAG, e.getMessage());                    }                    @Override                    public void onResponse(String response, int id) {                        Log.i(TAG, response);                    }                });

我们看到onError方法用了两种方式打印,但是结果确是

这里写图片描述

蓝色部分是e.printStackTrace();
黑色部分是Log.i(TAG, e.getMessage());
我们发现确实只能打印响应码。。。
那要如何输出错误的网页全部信息呢,我们来看看基类Callback

public abstract class Callback<T>{    /**     * UI Thread     *     * @param request     */    public void onBefore(Request request, int id)    {    }    /**     * UI Thread     *     * @param     */    public void onAfter(int id)    {    }    /**     * UI Thread     *     * @param progress     */    public void inProgress(float progress, long total , int id)    {    }    /**     * if you parse reponse code in parseNetworkResponse, you should make this method return true.     *     * @param response     * @return     */    public boolean validateReponse(Response response, int id)    {        return response.isSuccessful();    }    /**     * Thread Pool Thread     *     * @param response     */    public abstract T parseNetworkResponse(Response response, int id) throws Exception;    public abstract void onError(Call call, Exception e, int id);    public abstract void onResponse(T response, int id);    public static Callback CALLBACK_DEFAULT = new Callback()    {        @Override        public Object parseNetworkResponse(Response response, int id) throws Exception        {            return null;        }        @Override        public void onError(Call call, Exception e, int id)        {        }        @Override        public void onResponse(Object response, int id)        {        }    };}

里面有一个方法validateReponse(Response response, int id),上面的注释if you parse reponse code in parseNetworkResponse, you should make this method return true.大概意思就是要解析数据就返回true吧,那我们就重写这个方法,都返回true看会发生什么

这里写图片描述

好像打印了错误的网页,但是仔细一看发现是onResponse中打印的,那表明onError方法就没用了,导致所有事情都要在onResponse中处理了(虽然本来就是都在这里处理的)。那有没有方法让错误的响应码提交到onError中呢?我们再看Callback类的validateReponse方法,它返回的是response.isSuccessful();,我们继续探索进去,发现如下代码

/**   * Returns true if the code is in [200..300), which means the request was successfully received,   * understood, and accepted.   */  public boolean isSuccessful() {    return code >= 200 && code < 300;  }

也就是说只有响应码是200到300间的才会走onResponse方法(没改之前),那都返回true要在哪里处理呢。看回validateReponse的注释,里面出现了parseNetworkResponse这个方法,这个方法有参数Response,这个可以得到响应码,然后还抛出一个Exception,而onError方法中刚好有一个Exception的参数,于是有一个大胆的猜想,parseNetworkResponse抛出的异常在onError中接收,所以重写这个方法

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

当响应码为200到300时,我们返回响应体,其余情况我们抛出一个异常到onError中,结果如我们所想

这里写图片描述

至此就完成了对OkHttpUtils中StringCallback中onError的扩展,附上自己重写的MyStringCallback类

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

这是一个抽象类,在调用的时候实现onResponse和onError方法就可以,跟StringCallback一样。

谢谢您的观看。