1. 程式人生 > >Okhttp 多網路通訊選擇實現方式

Okhttp 多網路通訊選擇實現方式

最近專案需求,需要android同時可以訪問內網以及外網,即不同的通訊走不同的網路,查閱相關資料後確定可行,但需一定的條件

1. 前提必備條件:

1) 控制板搭載的android系統版本需要5.0以上
2) 控制板搭載的android系統需要同時支援多網路連線共存,即滿足wifi網路,行動網路,網絡卡能夠同時連線且分配到各自網路的IP地址,不能出現連線一個網路後自動將另一個網路斷開(反例:當前控制板連線WiFi,但在網口接入網路後自動斷開並關閉WIFI連線,且之後無法手動連線WIFI)。

2. 使用系統提供的API進行網路連線時自定義選擇相應的網路(示例程式碼如下)

final ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
//需要android 系統5.0以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && connectivityManager != null) { NetworkRequest.Builder builder = new NetworkRequest.Builder(); //選擇連線資料走的網路,這裡示例為WiFi,可根據不同的連線需要選擇不同的網路即可 builder.addTransportType
(NetworkCapabilities.TRANSPORT_WIFI); NetworkRequest networkRequest = builder.build(); connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onAvailable(final Network network) { super.onAvailable
(network); //網路接通後 SocketFactory socketFactory = network.getSocketFactory(); //如果使用eclipse MQTT 包,則需設定 mqttConnectOptions.setSocketFactory(socketFactory); //如果使用常規的網路連線,okhttp ,則需設定 OkHttpClient okHttpClient = new OkHttpClient.Builder() //.proxy(Proxy.NO_PROXY) .socketFactory(socketFactory) .dns(new Dns() { @Override public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException { return Arrays.asList(network.getAllByName(hostname)); } }) .build(); Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl("http://wanandroid.com/") .addConverterFactory(ScalarsConverterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); showMsg("網路已連線 "); } }); }