package com.duqing.missions.retrofit; import androidx.annotation.Nullable; import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; import java.nio.charset.Charset; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.Call; import okhttp3.EventListener; import okhttp3.Handshake; import okhttp3.Protocol; import okhttp3.Request; import okhttp3.Response; /** * My father is Object, ites purpose of 接口请求耗时监听 * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2021-7-9. */ public class NetWorkListenear extends EventListener { private static final String TAG = "NetworkEventListener"; final Charset UTF8 = Charset.forName("UTF-8"); public static Map workCostMap = new HashMap<>(); public static Factory get(){ Factory factory = new Factory() { @NotNull @Override public EventListener create(@NotNull Call call) { return new NetWorkListenear(); } }; return factory; } @Override public void callStart(@NotNull Call call) { super.callStart(call); //mRequestId = mNextRequestId.getAndIncrement() + ""; //getAndAdd,在多线程下使用cas保证原子性 NetWorkCost netWorkCost = new NetWorkCost(); netWorkCost.total = new Date().getTime(); workCostMap.put(call.request().hashCode(),netWorkCost); } @Override public void dnsStart(@NotNull Call call, @NotNull String domainName) { super.dnsStart(call, domainName); //Log.d(TAG, "dnsStart"); workCostMap.get(call.request().hashCode()).dns = new Date().getTime(); } @Override public void dnsEnd(@NotNull Call call, @NotNull String domainName, @NotNull List inetAddressList) { super.dnsEnd(call, domainName, inetAddressList); //Log.d(TAG, "dnsEnd"); workCostMap.get(call.request().hashCode()).dns = new Date().getTime() - workCostMap.get(call.request().hashCode()).dns; } @Override public void connectStart(@NotNull Call call, @NotNull InetSocketAddress inetSocketAddress, @NotNull Proxy proxy) { super.connectStart(call, inetSocketAddress, proxy); //Log.d(TAG, "connectStart"); workCostMap.get(call.request().hashCode()).connect = new Date().getTime(); } @Override public void secureConnectStart(@NotNull Call call) { super.secureConnectStart(call); //Log.d(TAG, "secureConnectStart"); workCostMap.get(call.request().hashCode()).secure = new Date().getTime(); } @Override public void secureConnectEnd(@NotNull Call call, @Nullable Handshake handshake) { super.secureConnectEnd(call, handshake); //Log.d(TAG, "secureConnectEnd"); workCostMap.get(call.request().hashCode()).secure = new Date().getTime() - workCostMap.get(call.request().hashCode()).secure; } @Override public void connectEnd(@NotNull Call call, @NotNull InetSocketAddress inetSocketAddress, @NotNull Proxy proxy, @Nullable Protocol protocol) { super.connectEnd(call, inetSocketAddress, proxy, protocol); //Log.d(TAG, "connectEnd"); workCostMap.get(call.request().hashCode()).connect = new Date().getTime() - workCostMap.get(call.request().hashCode()).connect; } @Override public void connectFailed(@NotNull Call call, @NotNull InetSocketAddress inetSocketAddress, @NotNull Proxy proxy, @Nullable Protocol protocol, @NotNull IOException ioe) { super.connectFailed(call, inetSocketAddress, proxy, protocol, ioe); workCostMap.get(call.request().hashCode()).connect = new Date().getTime() - workCostMap.get(call.request().hashCode()).connect; workCostMap.get(call.request().hashCode()).total = new Date().getTime() - workCostMap.get(call.request().hashCode()).total; //Log.d(TAG, "connectFailed"); } @Override public void requestHeadersStart(@NotNull Call call) { super.requestHeadersStart(call); //Log.d(TAG, "requestHeadersStart"); workCostMap.get(call.request().hashCode()).requestHeader = new Date().getTime(); } @Override public void requestHeadersEnd(@NotNull Call call, @NotNull Request request) { super.requestHeadersEnd(call, request); //Log.d(TAG, "requestHeadersEnd"); workCostMap.get(call.request().hashCode()).requestHeader = new Date().getTime() - workCostMap.get(call.request().hashCode()).requestHeader; } @Override public void requestBodyStart(@NotNull Call call) { super.requestBodyStart(call); //Log.d(TAG, "requestBodyStart"); workCostMap.get(call.request().hashCode()).requestBody = new Date().getTime(); } @Override public void requestBodyEnd(@NotNull Call call, long byteCount) { super.requestBodyEnd(call, byteCount); //Log.d(TAG, "requestBodyEnd"); workCostMap.get(call.request().hashCode()).requestBody = new Date().getTime() - workCostMap.get(call.request().hashCode()).requestBody; } @Override public void responseHeadersStart(@NotNull Call call) { super.responseHeadersStart(call); //Log.d(TAG, "responseHeadersStart"); workCostMap.get(call.request().hashCode()).resposeHeader = new Date().getTime(); } @Override public void responseHeadersEnd(@NotNull Call call, @NotNull Response response) { super.responseHeadersEnd(call, response); //Log.d(TAG, "responseHeadersEnd"); workCostMap.get(call.request().hashCode()).resposeHeader = new Date().getTime() - workCostMap.get(call.request().hashCode()).resposeHeader; } @Override public void responseBodyStart(@NotNull Call call) { super.responseBodyStart(call); //Log.d(TAG, "responseBodyStart"); workCostMap.get(call.request().hashCode()).resposeBody = new Date().getTime(); } @Override public void responseBodyEnd(@NotNull Call call, long byteCount) { super.responseBodyEnd(call, byteCount); //Log.d(TAG, "responseBodyEnd"); workCostMap.get(call.request().hashCode()).resposeBody = new Date().getTime() - workCostMap.get(call.request().hashCode()).resposeBody; workCostMap.get(call.request().hashCode()).total = new Date().getTime() - workCostMap.get(call.request().hashCode()).total; } @Override public void callFailed(@NotNull Call call, @NotNull IOException ioe) { super.callFailed(call, ioe); workCostMap.get(call.request().hashCode()).total = new Date().getTime() - workCostMap.get(call.request().hashCode()).total; //Log.d(TAG, "callFailed"); } }