使用Network.getAllByName执行网络特定的主机名解析

3
在ConnectivityManager文档中,bindProcessToNetwork javadoc中有以下注释:

使用通过Network.getSocketFactory().createSocket()创建的单独绑定的套接字,并通过Network.getAllByName执行特定于网络的主机名解析,优于调用bindProcessToNetwork。

在OkHttp中,有setSocketFactory来满足评论的第一部分,但我不知道如何/在哪里使用Network.getAllByName来执行主机名解析。
有任何想法如何执行?
1个回答

3

好的,我终于找到了如何执行这个操作。 正如我在问题中所说的那样,我正在使用OkHttpClient来设置我的socketfactory。对于名称解析也是一样,使用dns(它需要OkHttp3)。

OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
    .socketFactory(network.getSocketFactory())
    .dns(NetworkDns.getInstance())

我的NetworkDns类正在寻找类似于这样的东西

public class NetworkDns implements Dns {

  private static NetworkDns sInstance;
  private Network mNetwork;

  public static NetworkDns getInstance() {
    if (sInstance == null) {
      sInstance = new NetworkDns();
    }
    return sInstance;
  }

  public void setNetwork(Network network) {
    mNetwork = network;
  }

  @Override
  public List<InetAddress> lookup(String hostname) throws UnknownHostException {
    if (mNetwork != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      return Arrays.asList(mNetwork.getAllByName(hostname));
    }
    return SYSTEM.lookup(hostname);
  }

  private NetworkDns() {
  }
}

当网络不为空时,它将在给定的网络上执行主机名解析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接