Выполните специфичные для сети разрешения имен хостов, используя Network.getAllByName

В документации по ConnectivityManager, в bindProcessToNetwork javadoc, есть следующий комментарий:

Использование индивидуально связанных сокетов, созданных Network.getSocketFactory(). CreateSocket() и выполнение специфичных для сети разрешений имен хостов через Network.getAllByName предпочтительнее вызова bindProcessToNetwork.

В OkHttp есть setSocketFactory чтобы удовлетворить первую часть комментария, но я понятия не имею, как / где использовать Network.getAllByName выполнить разрешение имени хоста.

Есть идеи, как это сделать?

1 ответ

Решение

Итак, я наконец-то узнаю, как это сделать. Как я уже сказал в своем вопросе, я использую OkHttpClient установить мой сокетфактори. То же самое для разрешения имени, используя 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() {
  }
}

Таким образом, когда сеть не равна нулю, она будет выполнять разрешение имени хоста в данной сети.

Другие вопросы по тегам