Выполните специфичные для сети разрешения имен хостов, используя 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() {
}
}
Таким образом, когда сеть не равна нулю, она будет выполнять разрешение имени хоста в данной сети.