【问题标题】:Network State with Jetpack composeJetpack compose 的网络状态
【发布时间】:2021-07-19 16:31:54
【问题描述】:

我想获取网络状态是指连接的网络在 Jetpack Compose 中是否有互联网连接。 如何实现它

【问题讨论】:

  • Jetpack Compose 通常关注 UI 问题。确定网络的状态与 UI 没有直接关系。

标签: android android-jetpack-compose


【解决方案1】:
val connectivityManager 
            = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val activeNetworkInfo = connectivityManager.getActiveNetworkInfo()

     Text(
if(
activeNetworkInfo != null && activeNetworkInfo.isConnected()
) "Connected"
else "Disconnected" 
)

这是一个显示网络状态的 Composable。正如上面评论中正确指出的那样,JC 更多地关注 UI,所以所有其他的东西仍然是旧的 Android 方式。 JC 只是简化(?)GUI 开发

【讨论】:

  • 这仅显示已连接的 Wi-Fi 或蜂窝网络,但不显示活动的 Internet 连接
  • 我不这么认为。请重新检查
  • 它显示活跃的互联网连接?或活动网络
  • 我认为它说明了活跃的互联网连接
  • 随时乐意提供帮助。
【解决方案2】:

如果您在 connectivityManager.activeNetworkInfo 被弃用时遇到问题,请尝试使用:

private 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
}

我从另一个问题的已接受答案中得到了答案。 欢迎随时查看:activeNetworkInfo is Deprecated

使用 JC 时,使用它来访问上下文:

val context = LocalContext.current

【讨论】:

  • 这应该是公认的答案。正如 James 所指出的,不推荐使用 activeNetworkInfo。
猜你喜欢
  • 2021-08-03
  • 1970-01-01
  • 2021-03-05
  • 2021-09-28
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多