简体   繁体   English

如何检查Android中的inter.net连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM