【问题标题】:Unable to display Toast notification when network is unavailable网络不可用时无法显示 Toast 通知
【发布时间】:2020-01-12 02:00:36
【问题描述】:

我正在尝试通过回调测试网络可用性。

我想在连接不可用时显示 toast 通知。当我可以访问互联网时, onAvailable() 工作正常。

onAvailable() 似乎不起作用。没有显示消息“没有互联网连接”的 Toast。

我已经阅读了有关 unAvailable() 的文档中的一些信息。提到了超时值。我假设 onUnavailable() 在此超时后被调用。但是,如果它与问题有关,我不会。

ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(@NonNull Network network) {
                Toast.makeText(MainActivity.this, "Request successful", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                Toast.makeText(MainActivity.this, "No internet connection", Toast.LENGTH_LONG).show();
        }
        };
        final ConnectivityManager connectivityManager
                = (ConnectivityManager) MainActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE);


        connectivityManager.registerNetworkCallback(new NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .build(), networkCallback);

【问题讨论】:

  • 这段代码是在后台线程上执行的吗?
  • 没有。它在主 ui 线程上执行
  • 我遇到了同样的问题。一种解决方法是,在注册更新回调的同时,调用 cm.requestNetwork(request, callback, timeout) 以获得指定超时的一次性请求。
  • + requestNetwork(..) 的最小 API 级别,超时为 26 ????

标签: java android android-studio networking


【解决方案1】:

面向 Android 7.0(API 级别 24)及更高版本的应用如果在清单中声明广播接收器,则不会接收 CONNECTIVITY_ACTION 广播。如果应用向 Context.registerReceiver() 注册 BroadcastReceiver 并且该上下文仍然有效,则应用仍将收到 CONNECTIVITY_ACTION 广播。

这里是link 的解决方案

【讨论】:

    【解决方案2】:

    您应该改写onLost(Network network) 方法!

    【讨论】:

    • onLost 方法在设备丢失网络时被调用(前段时间有一个)。当用户首先没有互联网时,它不会被调用(这是我要检查的)。这不能解决我的问题
    • connectivityManager.requestNetwork(...)可以指定超时值。但是当应用程序在没有互联网连接的情况下启动时会到达一次onUnavailable(),您应该在其上调用requestNetwork(...) 以再次监听连接变化。
    【解决方案3】:

    onNetwork断线可以回调onLost()

      val networkCallback = object : ConnectivityManager.NetworkCallback() {
                 override fun onAvailable(network: Network) {
                     Toast.makeText(this@MainActivity, "Request successful", Toast.LENGTH_LONG).show()
                 }
    
                 override fun onUnavailable() {
                     super.onUnavailable()
                     Toast.makeText(this@MainActivity, "onUnavailable", Toast.LENGTH_LONG).show()
                 }
    
                 override fun onLost(network: Network) {
                     super.onLost(network)
                     Toast.makeText(this@MainActivity, "onLost", Toast.LENGTH_LONG).show()
                 }
    
    
             }
             val connectivityManager = this@MainActivity.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    
    
             connectivityManager.registerNetworkCallback(NetworkRequest.Builder()
                     .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                     .build(), networkCallback)
    

    【讨论】:

    • onLost 方法在设备丢失网络时被调用(前段时间有一个)。当用户首先没有互联网时,它不会被调用(这是我要检查的)。这不能解决我的问题。感谢您的评论
    • ConnectivityManager ConnectMgr = (ConnectivityManager) context.getSystemService("connectivity"); if (ConnectMgr == null) { return false; } else { NetworkInfo NetInfo = ConnectMgr.getActiveNetworkInfo();返回 NetInfo == null ?假:NetInfo.isConnected(); // 如果你连接到网络,这将告诉你——如果没有,那么在这种情况下你可以显示 toast 消息 }
    【解决方案4】:

    为什么不使用广播接收器? 如果您可以使用广播接收器,请检查此项。 https://www.tutorialspoint.com/how-to-check-internet-connection-in-android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多