[英]How to check internet connection in Android
In my application I want check inte.net connection and for this I write below codes.在我的应用程序中,我想检查 inte.net 连接,为此我写了下面的代码。
But when before run application and disconnect inte.net, not call checked inte.net code!但是在运行应用程序并断开 inte.net 之前,不会调用已检查的 inte.net 代码!
Just when inte.net connection is connected and run application with connected inte.net then disconnect inte.net show inte.net is connect or disconnect!就在 inte.net 连接已连接并使用已连接的 inte.net 运行应用程序时,然后断开 inte.net 显示 inte.net 已连接或断开连接!
Inte.net connection class :互联网连接 class :
class NetworkConnectivity @Inject constructor(private val manager: ConnectivityManager, private val request: NetworkRequest) : ConnectivityStatus {
override fun observe(): Flow<Boolean> {
return callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
launch { send(true) }
}
override fun onLost(network: Network) {
super.onLost(network)
launch { send(false) }
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.registerDefaultNetworkCallback(callback)
} else {
manager.registerNetworkCallback(request, callback)
}
awaitClose {
manager.unregisterNetworkCallback(callback)
}
}
}
}
ViewModel class:查看模型 class:
@HiltViewModel
class DetailViewModel @Inject constructor(private val repository: MainRepository) : ViewModel() {
@Inject
lateinit var networkConnectivity: NetworkConnectivity
val detailData = MutableLiveData<NetworkRequest<ResponseDetailPage>>()
fun callDetailApi(id: Int, apiKey: String) = viewModelScope.launch {
Log.e("DetailLog","ViewModel 1")
networkConnectivity.observe().collect {
if (it) {
Log.e("DetailLog","ViewModel 2")
detailData.value = NetworkRequest.Loading()
//Response
val response = repository.remote.recipeInformation(id, apiKey)
detailData.value = NetworkResponse(response).generalNetworkResponse()
} else {
Log.e("DetailLog","ViewModel 3")
detailData.value = NetworkRequest.Error("No internet connection")
}
}
}
}
After run application (when inte.net is disconnected) just show ViewModel 1 log in logcat
!运行应用程序后(当 inte.net 断开连接时)只需在
logcat
中显示ViewModel 1登录!
Why not checked inte.net when start application with disconnected mode?为什么在以断开连接模式启动应用程序时不检查 inte.net?
I'm using this function to check for inte.net connectivity:我正在使用这个function检查 inte.net 连接:
fun isInternetAvailable(context: Context): Boolean {
var result = false
val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val networkCapabilities = connectivityManager.activeNetwork ?: return false
val actNw =
connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
result = when {
actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
else -> false
}
} else {
connectivityManager.run {
connectivityManager.activeNetworkInfo?.run {
result = when (type) {
ConnectivityManager.TYPE_WIFI -> true
ConnectivityManager.TYPE_MOBILE -> true
ConnectivityManager.TYPE_ETHERNET -> true
else -> false
}
}
}
}
return result
}
If you target SDK23+, you can remove build version check.如果您以 SDK23+ 为目标,则可以删除构建版本检查。
Here's how I call this function in my viewmodel :这是我在我的视图模型中调用这个function的方式:
private val _internetIsAvailable = MutableLiveData<Boolean?>()
val extInternetAvailable: LiveData<Boolean?> get() = _internetIsAvailable
private val _loadStatus = MutableLiveData<LoadStatus>()
val extLoadStatus: LiveData<LoadStatus> get() = _loadStatus
init {
// runs every time VM is created (not view created)
viewModelScope.launch {
_loadStatus.value = LoadStatus.LOADING
_internetIsAvailable.value = NetworkChecker(app).isInternetAvailable()
_loadStatus.value = LoadStatus.DONE
}
}
In fragments :在片段中:
private fun observeInternetAvailability() {
mainVM.extInternetAvailable.observe(this) { intAvailable ->
Logger.d("Internet is $intAvailable")
if (intAvailable == false) {
ToastUtils.updateWarning(this, getString(R.string.no_internet))
showLoading(true)
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.