EventListener接口
EventListener是OkHttp库中的一个接口,用于监听OkHttp请求的各种事件,比如DNS解析、连接建立、请求发送、响应接收等。通过实现EventListener接口,可以自定义处理这些事件,以便进行日志记录、性能监控、错误处理等操作。
EventListener接口定义了一系列回调方法,可以在请求的不同阶段进行处理。例如:
-
callStart(Call call)
: 在请求开始时调用 -
dnsStart(Call call, String domainName)
: 在DNS解析开始时调用 -
connectStart(Call call, InetSocketAddress inetSocketAddress, Proxy proxy)
: 在连接建立开始时调用 -
connectEnd(Call call, InetSocketAddress inetSocketAddress, Proxy proxy, Protocol protocol)
: 在连接建立结束时调用 -
requestHeadersStart(Call call)
: 在请求头发送开始时调用 -
responseHeadersEnd(Call call, Response response)
: 在响应头接收结束时调用 -
callEnd(Call call)
: 在请求结束时调用
通过实现EventListener接口,并将其注册到OkHttp的请求中,可以方便地对请求过程进行监控和处理。
EventListener eventListener = new EventListener() {
// 实现需要的回调方法
};
OkHttpClient client = new OkHttpClient.Builder()
.eventListener(eventListener)
.build();
这样,在每次发起请求时,就会触发EventListener中相应的回调方法,从而实现对请求过程的监听和处理。
Interceptor接口
OkHttp的Interceptor是一个强大的工具,可以用于在发送请求和接收响应时进行拦截和修改。你可以使用Interceptor来添加、修改或删除请求的header,修改请求的url,记录请求日志,处理身份验证等操作。
在OkHttp中,Interceptor是通过实现okhttp3.Interceptor
接口来创建的。它包括一个intercept
方法,该方法接收一个Chain
对象作为参数,可以在方法中对请求进行处理,并通过Chain
对象继续传递请求。
以下是一个简单的示例:
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import Java.io.IOException;
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
在这个示例中,我们创建了一个名为LoggingInterceptor
的拦截器,它在intercept
方法中打印了请求和响应的日志信息。
你可以根据自己的需求实现不同的Interceptor来完成各种操作。
OkHttp请求耗时统计
通过Interceptor简单统计请求耗时
可以使用OkHttp的Interceptor来统计请求耗时。你可以创建一个自定义的Interceptor,在其中记录请求开始和结束的时间,并计算耗时。以下是一个简单的示例:
public class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long startTime = System.nanoTime();
Response response = chain.proceed(request);
long endTime = System.nanoTime();
long duration = (endTime - startTime) / 1e6; // 毫秒
System.out.println(String.format("发送请求 %s 耗时 %.1f ms%n", request.url(), duration));
return response;
}
}
在创建OkHttpClient时,将这个Interceptor添加进去:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
这样每次发起请求时,都会在控制台输出请求的URL和耗时。
通过EventListener统计请求耗时
-
创建一个EventListener的实现类,重写相应的方法来监听请求的开始和结束时间。
-
在EventListener的实现类中,可以使用System.currentTimeMillis()来获取当前时间戳,从而计算请求的耗时。
-
在请求开始时记录开始时间,在请求结束时记录结束时间,并计算耗时时间。
-
可以将耗时时间记录到日志中或者进行其他统计处理。
下面是一个简单的EventListener实现示例:
class TimingEventListener extends EventListener {
private long startNs;
@Override
public void callStart(Call call) {
startNs = System.nanoTime();
}
@Override
public void callEnd(Call call) {
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
// 将耗时时间记录到日志中或者进行其他统计处理
Log.d("RequestTiming", "Request took: " + tookMs + "ms");
}
}
在创建OkHttp的HttpClient时,将EventListener实例添加到OkHttp的Builder中:
OkHttpClient client = new OkHttpClient.Builder()
.eventListener(new TimingEventListener())
.build();
这样就可以通过EventListener来统计请求的耗时了。
原文始发于微信公众号(沐雨花飞蝶):OkHttp网络请求耗时统计
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/255769.html