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擴展進去。可參考項目地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章