android开发之网络强度和网络是否可用工具

5 篇文章 0 订阅
1 篇文章 0 订阅

首先,这是kotlin编程

引言

好吧,网上呢,有很多网络的工具库,但是,我找到的不能满足我的需求。
我出现了WiFi信号非常强的,但是无法访问网络;较强的WiFi网络又不稳定。
网上的很多库只是在重复,有连接吗?连接了有哪个网络可用的关键字没有?所以不满足我的需求。
于是,参考了一些网络上的方法,自己和同事的一些讨论,自己做了两个方法,
虽然不是封装得非常好,但基本可以满足需求了。

1.强信号网络但却无法访问网络。

但是如果百度服务器宕机了就没办法。事实上,访问百度还是能比较稳定可靠的。
注意,网络耗时操作需要在多线程中进行,或者说需要在UI主线程的子线程中执行。
或者如果你是个高手,把它弄到协程中应该也是可以的,我只是个渣渣。
//网络耗时操作需要在多线程中进行。顺便把线程封装到此方法中。
fun sendRequestWithOkHttp() {
        Thread(Runnable {
            try {
                val client = OkHttpClient()
                client.newBuilder()
                    .connectTimeout(500, TimeUnit.MILLISECONDS)
                    .readTimeout(500, TimeUnit.MILLISECONDS)
//                    .retryOnConnectionFailure(true)
                val request = Request.Builder()
                    .url("https://www.baidu.com")  //访问百度网址,当然也可以访问其他的。
                    .build()
//                val response = client.newCall(request).execute()
                val call: Call = client.newCall(request)
                val response = call.execute()
                if (response.code() == 200) {   //可访问网络的返回码
                    netSetUi(true)
                } else {
                    netSetUi(false)
                }
                call.cancel()
            } catch (e: Exception) {
                netSetUi(false)
                e.printStackTrace()
            } finally {

            }
        }).start()
    }
/**
得到是否可访问网络的状态,并到主线程中进行相关的UI更新。
*/
 private fun netSetUi(isOk: Boolean) {
        runOnUiThread {
            if (isOk) {
                UI() //伪代码,如果是在viewmodel中,还可以设置某个被观察者的值,然后在UI上观察它
            } else {
                UI() //伪代码
            }
        }
    }

2.较强网络信号,但是网络不稳定。

可以访问网络,但是,响应时间比较慢或者说非常慢。

/**
* @desc这里面有多个过时方法,而且需求的版本需要在android6以上。
* @param [context, levelDbm] 上下文,需要设定的DBM值
* @return true rssi的绝对值要比设置的dbm的值要小。 我设置50,50算是强网络了,65-79网络不稳定
*/
@RequiresApi(Build.VERSION_CODES.M)
    fun netStrength(context: Context, levelDbm: Int): Boolean {
        val manager: ConnectivityManager =
            context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager;
        val netInfo = manager.activeNetworkInfo
        if (!netInfo.isConnectedOrConnecting) {
            return false
        } else {
            when (netInfo.type) {
                ConnectivityManager.TYPE_WIFI -> {
                    val wifiManager =
                        context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
                    val wifiCntInfo = wifiManager.connectionInfo
                    return wifiCntInfo.rssi.absoluteValue <= levelDbm
                }
                ConnectivityManager.TYPE_MOBILE -> { //移动手机的还没有考虑
                    return true
                }
                else -> {
                    return false
                }
            }
        }
    }

最后,通过构造二者的合理逻辑,使之符合我的需求。
另外,如果需要全局的context,可以参考

当然,这是kotlin,如果你有一定的Java基础和Kotlin基础,如果需要转换kotlin->Java,语法转换上对你来说应该不难。不过,用了Kotlin,可以简化了很多代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值