Android : erreur UntaggedSocketViolation lors de l'utilisation de OkHttp

OkHttp peut créer des sockets non taggués, dans des threads enfants (ou réutilisés), ce qui génère des erreurs Logcat pour l'application.

Pour corriger cela, il ne sert à rien de TrafficStats.setThreadStatsTag dans le thread parent, puisqu'il ne sera pas descendu correctement jusqu'à OkHttp de par sa manière de fonctionner.

Il faut ajouter un EventListener sur la création du Client qui se chargera de tagguer directement le socket :

OkHttpClient client = new OkHttpClient.Builder()
       .eventListener(getEventListener())

    public final int tagSocket = 1234;
    public EventListener getEventListener() {
        return new EventListener() {
            @Override
            public void connectStart(@NonNull Call call, @NonNull InetSocketAddress inetSocketAddress, @NonNull Proxy proxy) {
                // Injecter un tag custom
                if(TrafficStats.getThreadStatsTag() != tagSocket) {
                    // Fix UntaggedSocketViolation: Untagged socket detected; use TrafficStats.setThreadSocketTag() to track all network usage
                    TrafficStats.setThreadStatsTag(tagSocket);
                }
            }

            @Override
            public void connectEnd(@NonNull Call call, @NonNull InetSocketAddress inetSocketAddress, @NonNull Proxy proxy, Protocol protocol) {
                TrafficStats.clearThreadStatsTag();
            }
        };