【问题标题】:Check connectivity to internet, hangs UI with bad signal检查与互联网的连接,挂起信号不良的 UI
【发布时间】:2023-03-14 23:02:02
【问题描述】:

我正在尝试使用从OnStart 方法调用的此方法检查connectivity(WIFI or cellular)internet

public static Boolean isInternetConn(Context ctx){

        ConnectivityManager connec = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        android.net.NetworkInfo wifi = connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        android.net.NetworkInfo mobile = connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        boolean connected= false;
        if((wifi != null && wifi.isConnectedOrConnecting()) || (mobile != null && mobile.isConnectedOrConnecting())){   

            try {

                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();             
                StrictMode.setThreadPolicy(policy);
                URL myurl = new URL("http://www.google.com");
                URLConnection connection;
                connection = myurl.openConnection();
                connection.setConnectTimeout(2000);
                connection.setReadTimeout(2000);
                HttpURLConnection httpConnection = (HttpURLConnection) connection;
                int responseCode = -1;
                responseCode = httpConnection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                      connected = true;
                      httpConnection.disconnect();
                }
                else {
                    httpConnection.disconnect();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();                
            }
        }

      return connected;
    }

如果网络信号低,该方法会挂起 UI,有时 UI 会变黑。 我已将超时配置为较低的值,但问题仍然存在。 是否建议在 Async Task 中执行此任务?

谢谢

【问题讨论】:

  • 使用带有进度条的处理程序.....你正在中断主 UI 线程
  • 所有长度操作都应该在主线程之外完成。 AsyncTask 提供了这样的类。推荐AsyncTask,这里没有什么好推荐的。如果它是在 UI 上完成的任务,则意味着您必须使用 Thread 类或专门化类。 Android 提供了这样一个名为AsyncTask的专门类

标签: android exception wifi httpconnection


【解决方案1】:

您似乎正在尝试 ping google 以检查您的网络连接。这是不必要的,在主线程上进行网络操作会破坏你的 UI。请改用以下方法:

public boolean isConnectingToInternet(Context context) {
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null)
            for (int i = 0; i < info.length; i++)
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
    }
    return false;
} 

记得在清单中添加ACCESS_NETWORK_STATEINTERNET 权限

编辑:要检查网络质量,请使用 facebook 创建的this 库。它将连接质量分为差(低于 150 kbps)、中等(介于 150 和 550 kbps 之间)、良好(介于 550 和 2000 kbps 之间)和优秀(超过 2000 kbps)。

【讨论】:

  • 如果 WIFI 或蜂窝连接已连接,则返回 TRUE,但不检查 Internet 连接是否正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2017-03-16
  • 2014-02-08
相关资源
最近更新 更多