监听网络状态

背景

硬件设备有时候断网或者网络不佳的时候,需要做出相应逻辑,比如跳转到网络异常界面,或者从网络异常界面恢复,当然也可能只是简单的提示。

第一步

写receiver

//这里传入了一个全局的livedata参数过来
class NetworkReceiver(private val liveNetInfo: MutableLiveData<NetworkInfo?>) :
    BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        context ?: return LogUtils.e("网络广播 Context Cannot be null")
        intent ?: return LogUtils.e("网络广播 Intent Cannot be null")
        //获得ConnectivityManager对象
        val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        //获取所有网络连接的信息
        val networks = connMgr.allNetworks
        val info = networks.map {
            connMgr.getNetworkInfo(it)
        }.firstOrNull {
            it?.isConnected == true
        }
        liveNetInfo.postValue(info)
//        LogUtils.d("网络广播 $info ping ${NetworkUtils.isAvailableByPing()}")

    }

}

//上面全局的livedata就是在这里定义的
class MyApplication : BaseApplication() {
    val liveNetworkStatus = MutableLiveData<NetworkInfo?>()

第二步

在合适位置注册广播

    private var netReceiver: NetworkReceiver? = null
    private fun initReceiver() {
        val liveNetworkStatus = (application as MyApplication).liveNetworkStatus
        netReceiver = NetworkReceiver(liveNetworkStatus)
        val timeFilter = IntentFilter()
        timeFilter.addAction("android.net.ethernet.ETHERNET_STATE_CHANGED")
        timeFilter.addAction("android.net.ethernet.STATE_CHANGE")
        timeFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
        timeFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED")
        timeFilter.addAction("android.net.wifi.STATE_CHANGE")
        timeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
        registerReceiver(netReceiver, timeFilter)
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initReceiver()

    }
   
    override fun onDestroy() {
        super.onDestroy()
        netReceiver?.let {
            unregisterReceiver(netReceiver)
        }
    }

第三步

监听并反馈逻辑给用户

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentErrorBinding.inflate(inflater)
        binding.vm = viewModel
        binding.lifecycleOwner = this
        //观察网络标记status
        (requireActivity().application as MyApplication).liveNetworkStatus.observe(
            viewLifecycleOwner
        ) { netInfo: NetworkInfo? ->
            if(netInfo?.isAvailable==true&&NetworkUtils.isAvailableByPing()){
                callBack.fromPay2Home()
            }
            LogUtils.i("liveNetInfo $netInfo ping ${NetworkUtils.isAvailableByPing()}")
        }
        return binding.root
    }

收工

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_ChuTT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值