对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一样。
谢谢您的观看。
- 对OkHttpUtils中onError方法进行扩展打印更多信息
- 对okhttputils的扩展
- 对js的函数方法进行扩展
- Swift3.0对UIColor进行方法扩展
- 对String类进行方法的扩展
- Android中打印堆栈信息的方法
- 对arptbales进行扩展
- 对bootstrapValidator进行扩展
- VS2010使用扩展方法对List<T>进行随机排序
- 三种方法可以对swap 分区进行扩展
- PHP面向对象编程:对父类方法进行扩展
- 打印对战内存异常信息到日志中
- 对文件上传进行更多的控制
- java中对父类的属性进行扩展
- C#中如何对当前窗体进行打印预览
- C#中如何对当前窗体进行打印预览
- eclipse中,对方法进行注释.
- 对HTML 通过GET 方法进行提交后,对信息进行解码JAVA类
- React-Native网络请求加载界面
- yarm详解
- Python——for循环
- River Hopscotch POJ
- 如何通过css实现自动换行
- 对OkHttpUtils中onError方法进行扩展打印更多信息
- 软件开发中的哲学思想
- VirtualKD+IDA+VM+Windbg调试无PDB内核驱动
- Python学习19_骨架提取与分水岭算法
- 1.高性能MySQL --- MySQL 架构
- c++如何防止一个类被其他类继承
- Python——自定义函数
- Python——随机函数(random)
- D