Okhttp 多网络通信选择实现方式
16lz
2021-01-26
最近项目需求,需要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 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("网络已连接 "); } }); }
更多相关文章
- [置顶] android中图片的三级cache策略(内存、文件、网络)之二:内存
- Android开发调试无法连接到夜神模拟器的解决方法
- Android下使用ACE开源网络库
- Ohone SDK的模拟器居然不能联网??
- 编程回忆之Android回忆(蓝牙BluetoothAdapter的搜索和连接)
- android 获取网络图片缓存(内存—>文件—>网络)
- Android设备通过网络adb 调试
- Android(安卓)开发自己的网络收音机1——功能要求及设计方案
- Android(安卓)网络状态监听那些事