首先,这是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,可以简化了很多代码。