Android OKHttp3拦截器的使用方法拦截器的使用方法
本篇文章主要介绍了Android OKHttp3拦截器的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个
参考。一起跟随小编过来看看吧
本文介绍了Android OKHttp3拦截器的使用方法,分享给大家,具体如下:
添加添加Interceptor
在上一篇中我们已经知道了okhttp的基本使用,其中在介绍OkHttpClient初始化的时候,介绍了两种方式,第二种方式就可以
对这个OkHttpClient对象设置拦截器,如下所示:
// 配置一些信息进入OkHttpClient
mOkHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.readTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.addInterceptor(new LoggerInterceptor())
.build();
如上代码,很简单,只要利用addInterceptor方法就可以添加拦截器,而自定义的拦截器只需要实现 Interceptor 接口就行了,
如下所示:
public class LoggerInterceptor implements Interceptor {
...
}
应用场景应用场景
日志打印
可以使用拦截器方便的打印网络请求时,需要查看的日志。如下所示:
public class LoggerInterceptor implements Interceptor {
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
// 拦截请求,获取到该次请求的request
Request request = chain.request();
// 执行本次网络请求操作,返回response信息
Response response = chain.proceed(request);
if (Configuration.DEBUG) {
for (String key : request.headers().toMultimap().keySet()) {
LogUtil.e("zp_test", "header: {" + key + " : " + request.headers().toMultimap().get(key) + "}");
}
LogUtil.e("zp_test", "url: " + request.url().uri().toString());
ResponseBody responseBody = response.body();
if (HttpHeaders.hasBody(response) && responseBody != null) {
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(responseBody.byteStream(), "utf-8"));
String result;
while ((result = bufferedReader.readLine()) != null) {
LogUtil.e("zp_test", "response: " + result);
}
// 测试代码
responseBody.string();
}
}
// 注意,这样写,等于重新创建Request,获取新的Response,避免在执行以上代码时,
// 调用了responseBody.string()而不能在返回体中再次调用。
return response.newBuilder().build();
}
}
做了一个打印验证:通过分别打印拦截器与返回体的时间和线程名字,可以知道这两者处于同一线程中,增加拦截器,请求执
行的时间也会增加,所以猜测,其实就是线性的在执行不同拦截器中的代码,根据需求返回一个相同的或者新的response。
缓存缓存
想要实现缓存,先在创建okhttpclint的时候多加一行代码 .cache() ,通过它来设置缓存目录,当然需要服务器支持缓存功能。
mOkHttpClient = new OkHttpClient().newBuilder()
.cache(new Cache(FileUtils.getCacheDirectory(AppApplication
评论0