Retrofit中 RestAdapter.LogLevel.FULL 含义,自己写错误处理方法+请求拦截器
2015-09-13 15:18
429 查看
转载:http://www.cnblogs.com/laiqurufeng/p/4484916.html
LOGGING
可以通过添加logging level等级来详细观看请求和响应. logging level 分为 BASIC, FULL, HEADERS, and NONE.
Full等级将会打印request和response的headers.body,和metadata等
不同于拦截器或者ErrorHandler,可以在RestAdapter生命周期的任何时候通过setLogLevel()添加或者更改logging level.
ERROR
如果需要自定义一个网络访问错误的处理方法,需要自定义一个ErrorHandler.下面的代码当返回码是401的时候抛出一个自定义异常.
特别注意在网络访问时返回码为40x,50x,IOException时,都会转化为RetrofitError再次抛出.
因为RetrofitError是RuntimeException.不会提示用户进行捕捉.所以如果在Android平台上就会造成应用崩溃.
解决办法就是不要采用同步的方式,采用CallBack异步的方式. 异常在CallBack的failure()方法中就可以得到妥善的处理.不会再次抛出.
ErrorHandler的handlerError()方法不能retrun null.否则会抛出RuntimeException.
实际开发中对Error最好做不同的处理.通过RetrofitError.getKind()获得具体的错误类型.
可以根据RetrofitError.getKind()来获取具体是哪种类型的错误.
RequestInterceptor 请求拦截器
对于网络访问请求的重复操作部分都可以这么做. 拦截器的执行是在执行网络访问前最后执行的. 所以会覆盖前面的某些配置.
LOGGING
可以通过添加logging level等级来详细观看请求和响应. logging level 分为 BASIC, FULL, HEADERS, and NONE.
Full等级将会打印request和response的headers.body,和metadata等
ERROR
如果需要自定义一个网络访问错误的处理方法,需要自定义一个ErrorHandler.下面的代码当返回码是401的时候抛出一个自定义异常.
class MyErrorHandler implements ErrorHandler { @Override public Throwable handleError(RetrofitError cause) { Response r = cause.getResponse(); if (r != null && r.getStatus() == 401) { return new UnauthorizedException(cause); } return cause; //返回值不能是null,否则运行时会出现异常. } }
因为RetrofitError是RuntimeException.不会提示用户进行捕捉.所以如果在Android平台上就会造成应用崩溃.
解决办法就是不要采用同步的方式,采用CallBack异步的方式. 异常在CallBack的failure()方法中就可以得到妥善的处理.不会再次抛出.
ErrorHandler的handlerError()方法不能retrun null.否则会抛出RuntimeException.
实际开发中对Error最好做不同的处理.通过RetrofitError.getKind()获得具体的错误类型.
RequestInterceptor 请求拦截器
对于网络访问请求的重复操作部分都可以这么做. 拦截器的执行是在执行网络访问前最后执行的. 所以会覆盖前面的某些配置.
RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("User-Agent", "Retrofit-Sample-App"); } };
相关文章推荐
- 非最大抑制(Non-maximum suppression)
- String Copy_on_write
- Hello HTML(初识HTML)
- 心得体会
- union
- Android-ListView组件
- 《剑指offer》数组中重复的数字
- nginx 1.80 编译参数及需要的库
- 宣告进步
- ACM动态规划之最少钱币问题
- Android sendevent/getevent 用法
- Android sendevent/getevent 用法
- NuttX 构建系统
- android之R cannot be resolved to a variable
- mac git
- 双向链表
- 使用Calendar类得到一年中的二月有多少天
- LeetCode Maximum Depth of Binary Tree
- String类
- 拍照、录视频