Android LiveData + NetworkCallback实现网络监听

添加依赖

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"

创建个用来判断网络类型的类(根据业务需求自行增添)

object NetworkState {

    // 无网络
    const val NONE = 0

    // 网络连接
    const val CONNECT = 1

    // WIFI
    const val WIFI = 2

    // 移动网络
    const val CELLULAR = 3

}

创建LiveData单例模式

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
class NetworkLiveData : LiveData<Int>() {

    private var networkCallback: ConnectivityManager.NetworkCallback

    private var request: NetworkRequest

    private var manager: ConnectivityManager

    init {
        networkCallback = NetworkCallbackImpl()
        request = NetworkRequest.Builder().build()
        manager = MyApp.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    }

    override fun onActive() {
        super.onActive()
        manager.registerNetworkCallback(request, networkCallback)
    }

    override fun onInactive() {
        super.onInactive()
        manager.unregisterNetworkCallback(networkCallback)
    }

    object NetworkLiveDataHolder {
        val INSTANCE = NetworkLiveData()
    }

    companion object {
        fun getInstance(): NetworkLiveData {
            return NetworkLiveDataHolder.INSTANCE
        }
    }

    class NetworkCallbackImpl : ConnectivityManager.NetworkCallback() {

        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            Log.d("onAvailable: ", "网络已连接")
            getInstance().postValue(NetworkState.CONNECT)
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            Log.d("onLost: ", "网络断开")
            getInstance().postValue(NetworkState.NONE)
        }

        override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
        ) {
            super.onCapabilitiesChanged(network, networkCapabilities)
            if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                Log.d("WIFI: ", "WIFI已连接")
                getInstance().postValue(NetworkState.WIFI)
            } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                Log.d("CELLULAR: ", "移动网络已连接")
                getInstance().postValue(NetworkState.CELLULAR)
            }
        }
    }
}

使用方法

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        NetworkLiveData.getInstance().observe(this, Observer {
            when (it) {
                NetworkState.CONNECT -> {
                    text.text = "网络已连接"
                }

                NetworkState.NONE -> {
                    text.text = "网络中断"
                }

                NetworkState.CELLULAR -> {
                    text.text = "移动网络已连接"
                }

                NetworkState.WIFI -> {
                    text.text = "WIFI已连接"
                }
            }
        })
    }
}

结语

到这里全部代码已经实现了,这里说一下使用NetworkCallback来进行网络监听是需要在API21以上,所以这里我们可以在NetworkLiveData中进行扩展,如果需要针对API21以下的话,可以将BroadcastReceiver扩展进去。可参考项目地址

猜你喜欢

转载自blog.csdn.net/zl_china/article/details/105832556
今日推荐