Android 检查与internet的连接,挂起带有错误信号的UI

Android 检查与internet的连接,挂起带有错误信号的UI,android,exception,wifi,httpconnection,Android,Exception,Wifi,Httpconnection,我正在尝试使用此方法检查到互联网的连接(WIFI或蜂窝),该方法称为fromOnStart方法: public static Boolean isInternetConn(Context ctx){ ConnectivityManager connec = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); android.net.NetworkInfo wifi =

我正在尝试使用此方法检查
互联网的连接(WIFI或蜂窝)
,该方法称为from
OnStart
方法:

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变为黑色。 我已将超时配置为较低的值,但问题仍在发生。 建议在异步任务中执行此任务


谢谢

看起来您正在尝试ping谷歌以检查您的网络连接。这是不必要的,在主线程上执行网络操作将破坏您的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;
} 
public boolean连接到Internet(上下文){
ConnectivityManager connectivity=(ConnectivityManager)context.getSystemService(context.connectivity\u SERVICE);
if(连接性!=null){
NetworkInfo[]info=connectivity.getAllNetworkInfo();
如果(信息!=null)
对于(int i=0;i
请记住在您的清单中添加
ACCESS\u NETWORK\u STATE
INTERNET
权限


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

看起来您正在尝试ping谷歌以检查您的网络连接。这是不必要的,在主线程上执行网络操作将破坏您的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;
} 
public boolean连接到Internet(上下文){
ConnectivityManager connectivity=(ConnectivityManager)context.getSystemService(context.connectivity\u SERVICE);
if(连接性!=null){
NetworkInfo[]info=connectivity.getAllNetworkInfo();
如果(信息!=null)
对于(int i=0;i
请记住在您的清单中添加
ACCESS\u NETWORK\u STATE
INTERNET
权限


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

使用带有进度条的处理程序。。。。。ur正在中断主Ui线程所有长度的操作都应该在主线程之外完成。AsyncTask提供这样的类<代码>异步任务
是推荐的,这里没有什么可推荐的。如果它是在UI之外完成的任务,则意味着您必须使用Thread类或specialize类。Android提供了这样一个名为
AsyncTask
use handler with progress bar的专门化类。。。。。ur正在中断主Ui线程所有长度的操作都应该在主线程之外完成。AsyncTask提供这样的类<代码>异步任务
是推荐的,这里没有什么可推荐的。如果它是在UI之外完成的任务,则意味着您必须使用Thread类或specialize类。Android提供了这样一个名为
AsyncTask
use handler with progress bar的专门化类。。。。。ur正在中断主Ui线程所有长度的操作都应该在主线程之外完成。AsyncTask提供这样的类<代码>异步任务是推荐的,这里没有什么可推荐的。如果它是在UI之外完成的任务,则意味着您必须使用Thread类或specialize类。Android提供名为
AsyncTask
的专门化类,如果连接了WIFI或蜂窝网络,则返回TRUE,但不检查互联网连接是否正常。如果连接了WIFI或蜂窝网络,则返回TRUE,但不检查互联网连接是否正常。如果连接了WIFI或蜂窝网络,则返回TRUE手机连接已连接,但不检查互联网连接是否正常