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

https://www.2cto.com/kf/201707/661662.html

最近开发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();,我们继续探索进去,发现如下代码

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

猜你喜欢

转载自blog.csdn.net/nimeghbia/article/details/84582423