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

2 篇文章 0 订阅
1 篇文章 0 订阅

最近项目需求,需要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("网络已连接  ");
                }
            });
        }
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值