Okhttp 多網路通訊選擇實現方式
阿新 • • 發佈:2019-01-02
最近專案需求,需要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("網路已連線 ");
}
});
}