互联网关闭时无法获得回调,然后应用程序在 NetworkCallback 内启动

Posted

技术标签:

【中文标题】互联网关闭时无法获得回调,然后应用程序在 NetworkCallback 内启动【英文标题】:Unable to get callback when internet is off and then app starts inside NetworkCallback 【发布时间】:2020-05-15 19:46:21 【问题描述】:

根据官方文档,由于 getActiveNetworkInfo 现在在 android 中已被弃用,我正在使用以下实现来获取有关 Internet 连接的回调。

private val connectivityManager: ConnectivityManager by lazy 
   getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager


private val builder: NetworkRequest.Builder by lazy 
   NetworkRequest.Builder()


private val networkCallback: NetworkCallback by lazy 
   object : NetworkCallback() 
      override fun onAvailable(network: Network?) 
          println("Connection is online")
      

      override fun onLost(network: Network?) 
          println("Connection is offline")
      
   


override fun onResume() 
   super.onResume()
   connectivityManager.registerNetworkCallback(builder.build(), networkCallback)


override fun onPause() 
   super.onPause()
   connectivityManager.unregisterNetworkCallback(networkCallback)

连接在线时注册这个回调很好用,但是断网后注册回调就不行了。为了测试这样的场景,我关闭了我的应用程序。然后关闭互联网连接,然后打开应用程序。

我们有什么方法可以知道应用程序正在打开吗?如果有,请帮忙分享一下。谢谢。

【问题讨论】:

在 onStart() 中执行 registerNetworkCallback(...) 并在 onStop() 中执行 unregisterNetworkCallback(...) 另外,重写onUnavailable(),确认注册/注销是否到位。 【参考方案1】:

根据您的问题,我建议您阅读 Android 文档的这一部分。您正在使用 onPause() 和 onResume(),您应该尝试 onStop()。

但我认为你必须在你的逻辑connectivityManager.unregisterNetworkCallback(networkCallback)之后调用super.onPause() 因为它会在你的方法被调用之前暂停应用程序。

【讨论】:

我在这里添加了示例代码,但问题是当互联网连接关闭然后用户打开应用程序时,当时没有获得连接状态。 你应该检查你的连接管理器是否仍然存在,同样的 onResume() 尝试将 super.onResume() 放在你的逻辑之下。 如果连接状态可用,您可以尝试检查恢复,如果没有尝试再次注册网络回调,如果这无助于尝试获取 ConnectivityManager 的新实例。【参考方案2】:
override func onUnavailable() 
   println("onUnavailable")

这个方法永远不会被调用。

【讨论】:

以上是关于互联网关闭时无法获得回调,然后应用程序在 NetworkCallback 内启动的主要内容,如果未能解决你的问题,请参考以下文章

在c中使用struct时无法获得价值[关闭]

应用程序关闭时如何接收 Android Nougat 网络丢失的回调?

连接到互联网时刷新应用程序

无法获得缺少的 gcm 推送通知

操作使用 indexedDB 获得的数据

asihttp 使用 POST 方法并将 nsMutabledata 发布到 uri,为啥我无法获得 asi 委托回调?