这是一个Kotlin版本,遵循Francesco Laurita的解决方案:
private val broadcastReceiver by lazy {
NetworkListener.create({
btnOnlineVideos.visibility = View.VISIBLE
}, {
btnOnlineVideos.visibility = View.GONE
})
}
override fun onResume() {
super.onResume()
NetworkListener.register(this, broadcastReceiver)
}
override fun onPause() {
super.onPause()
NetworkListener.unregister(this, broadcastReceiver)
}
为了使这个工作,我只需覆盖
onResume
和
onPause
方法,以注册和注销
BroadcastReceiver
。
这是如何工作的?
我创建了以下类来帮助初始化、注册和注销
BroadcastReceiver
。这样就不需要重复大部分样板代码了。
package com.programacionymas.app.services
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.net.NetworkInfo
import android.os.Parcelable
import android.util.Log
object NetworkListener {
fun create(onNetworkUp: () -> Unit, onNetworkDown: () -> Unit): BroadcastReceiver {
return object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
intent.extras?.getParcelable<Parcelable>("networkInfo")?.let {
val info = it as NetworkInfo
val state: NetworkInfo.State = info.state
Log.d("BroadcastReceiver", "$info $state")
if (state === NetworkInfo.State.CONNECTED) {
onNetworkUp()
} else {
onNetworkDown()
}
}
}
}
}
fun register(context: Context, broadcastReceiver: BroadcastReceiver) {
val intentFilter = IntentFilter()
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
context.registerReceiver(broadcastReceiver, intentFilter)
}
fun unregister(context: Context, broadcastReceiver: BroadcastReceiver) {
context.unregisterReceiver(broadcastReceiver)
}
}
如果您只需要为其中一个状态执行语句,您也可以传递 null
匿名函数:
private val broadcastReceiver by lazy {
NetworkListener.create(null, {
toast(getString(R.string.check_your_internet))
finish()
})
}
在create
方法中将参数声明为可选的:
fun create(onNetworkUp: (()->Unit)?, onNetworkDown: (()->Unit)?): BroadcastReceiver {}
同时,仅在将函数作为参数发送时调用它们:
if (state === NetworkInfo.State.CONNECTED) {
onNetworkUp?.invoke()
} else {
onNetworkDown?.invoke()
}