Android Flow监听网络状态

这些个api要用到api24

你可以往下写兼容代码 也可以先不去适配使用minSdk这样

minSdk 24

 

用到了一个接口

package com.example.prettynumber

import kotlinx.coroutines.flow.Flow
//监听状态。并返回流
interface ConnectivityObserver {
    fun observer(): Flow<Status>
    enum class Status{
        Available,Unavailable,Losing,Lost
    }
}

实现

package com.example.prettynumber

import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.os.Build
import androidx.annotation.RequiresApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch

class NetworkConnectivityObserver(private val context: Context) : ConnectivityObserver {
    private val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    @RequiresApi(Build.VERSION_CODES.N)
    override fun observer(): Flow<ConnectivityObserver.Status> {
        return callbackFlow {
            val callbacks = object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    super.onAvailable(network)
                    launch {
                        send(ConnectivityObserver.Status.Available)
                    }
                }

                override fun onLosing(network: Network, maxMsToLive: Int) {
                    super.onLosing(network, maxMsToLive)
                    launch {
                        send(ConnectivityObserver.Status.Losing)
                    }
                }

                override fun onLost(network: Network) {
                    super.onLost(network)
                    //更新当前事件
                    launch {
                        send(ConnectivityObserver.Status.Lost)
                    }
                }

                override fun onUnavailable() {
                    super.onUnavailable()
                    launch {
                        send(ConnectivityObserver.Status.Unavailable)
                    }
                }


            }
            //注册事件,需要表明 要大于24才行哦
            connectivityManager.registerDefaultNetworkCallback(callbacks)
            //解除注册事件
            awaitClose {
                connectivityManager.unregisterNetworkCallback(callbacks)
            }


        }
            //防止重复注册事件
            .distinctUntilChanged()
    }

}

使用

class MainActivity : ComponentActivity() {
    private lateinit var connectivityObserver: ConnectivityObserver
    private val TAG = "MainActivity"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        connectivityObserver = NetworkConnectivityObserver(applicationContext)
        connectivityObserver.observer().onEach {
            Log.e(TAG, "Status is: ${it}")
        }.launchIn(lifecycleScope)
        setContent {
            PrettyNumberTheme {

                val status by connectivityObserver.observer().collectAsState(
                    initial = ConnectivityObserver.Status.Unavailable
                )
                Box(
                    modifier = Modifier.fillMaxSize(),
                    contentAlignment = Alignment.Center
                ) {
                    Text(text = "Network status:${status}")
                }
            }

        }
    }
}

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/126330541
今日推荐