2017-12-23 45 views
0

특정 요청을 라우팅해야합니다. wifi를 "Connected, no internet"및 "Mobile Data"가 켜져 있습니다. 예를 들어 아래OkHttp 경로 트래픽 wifi 및 SocketFactory를 던졌습니다.

HttpURLConnection와 함께 잘 작동하지만 응용 프로그램에 대한 기본 네트워크 라이브러리입니다 OkHttp3 (3.8.1)와 함께 작동 : 3.4.2

아래

코드 OkHttp 버전 예상대로 작동

그러나 OkHttp 버전 이후 깨진 : 3.5.0

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     final Network[] networks = connectivityManager.getAllNetworks(); 

     for (final Network network : networks) { 
      final NetworkInfo netInfo = connectivityManager.getNetworkInfo(network); 
      if (netInfo.getType() == ConnectivityManager.TYPE_WIFI && netInfo.getState() == NetworkInfo.State.CONNECTED) { 

      // just for example HttpURLConnection works as expected and route traffic throw wifi 
      connection = (HttpURLConnection) network.openConnection(url); 

      // not works since >=3.5.0, route traffic in same way 
      builder.socketFactory(network.getSocketFactory()); 

      } 
     } 
    } 

OkHttpClient client = builder.build(); 
final Response response = client.newCall(initialRequest).execute(); 

client.newCall없는 작품 이해, 아니면 단순한 누락의로 예상대로 뭔가.

답변

0

마지막으로 발견했습니다.

https://github.com/square/okhttp/commit/2a5fb08b39195d4238c7117e851e9221f94de62a#diff-ec23bee7240c28053b0ca4fbc6029529

그래서 당신은 다시 당신이 먹는 java.net.ProxySelector.getDefault()도 NO_PROXY을 시도 하나를 포장 할 수 있습니다 (3.4.2 버전에서처럼) 이전 동작을 얻으려면. 위에서 설명한 내 경우

은 내가 수동으로 비활성화 프록시 이전의 SocketFactory를 추가해야합니다

builder.proxy(Proxy.NO_PROXY); 
builder.socketFactory(network.getSocketFactory());