Okhttp 多网络通信选择实现方式

版权声明:博主原创文章,转载请注明出处。 https://blog.csdn.net/ngl272/article/details/82699675

最近项目需求,需要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("网络已连接  ");
                }
            });
        }
展开阅读全文

没有更多推荐了,返回首页