Java 检查Android中的Internet连接是否处于活动状态

Java 检查Android中的Internet连接是否处于活动状态,java,android,Java,Android,我正在尝试在我的应用程序中检查internet连接。 首先,我检查wifi或移动数据是否打开,然后我检查是否有活动的互联网连接。 我目前正在做的事情: public class ConnectivityReceiver extends BroadcastReceiver { String TAG="ConnectivityReceiver"; public static boolean hasInternetAccess() { try { HttpU

我正在尝试在我的应用程序中检查internet连接。 首先,我检查wifi或移动数据是否打开,然后我检查是否有活动的互联网连接。 我目前正在做的事情:

    public class ConnectivityReceiver extends BroadcastReceiver {

    String TAG="ConnectivityReceiver";

public static boolean hasInternetAccess() {
    try {
        HttpURLConnection urlc = (HttpURLConnection)
                (new URL("http://clients3.google.com/generate_204")
                        .openConnection());
        urlc.setRequestProperty("User-Agent", "Android");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1500);
        urlc.connect();
        return (urlc.getResponseCode() == 204 &&
                urlc.getContentLength() == 0);
    } catch (IOException e) {

    }

    return false;
}


@Override
public void onReceive(Context arg0, Intent intent) {
      String action = intent.getAction();


        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false);
         if(noConnectivity){
             try{

                 TaskListAndOptionsActivity.item3.setIcon(R.drawable.ic_action_network_nowifi);
             }
             catch(Exception e)
             {

             }
         }
         else
         {
             Boolean status = hasInternetAccess();
             if(status==true)
             {
                 try{
                     TaskListAndOptionsActivity.item3.setIcon(R.drawable.ic_action_network_wifi);
                 }
                 catch(Exception e)
                 {

                 }
             }
             else
             {
                 try{

                     TaskListAndOptionsActivity.item3.setIcon(R.drawable.ic_action_network_nowifi);
                 }
                 catch(Exception e)
                 {

                 }
             }


         }


}
但我得到了以下错误:

java.lang.RuntimeException: Unable to start receiver connectionchecker.ConnectivityReceiver: android.os.NetworkOnMainThreadException
            at android.app.ActivityThread.handleReceiver(ActivityThread.java:2668)
            at android.app.ActivityThread.access$1800(ActivityThread.java:172)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5653)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
            at java.net.InetAddress.getAllByName(InetAddress.java:214)
            at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:390)
            at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:343)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:289)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
            at connectionchecker.NetworkUtil.hasInternetAccess(NetworkUtil.java:21)
            at connectionchecker.ConnectivityReceiver.onReceive(ConnectivityReceiver.java:46)
            at android.app.ActivityThread.handleReceiver(ActivityThread.java:2653)
            at android.app.ActivityThread.access$1800(ActivityThread.java:172)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5653)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)
您需要不在UIthread上执行网络操作

您需要不在UIthread上执行网络操作

您需要不在UIthread上执行网络操作


您需要在非UIthread上执行网络操作。

您试图在UI线程中连接到网络,这是不允许的。要检查活动的internet连接,请使用以下方法

public boolean isConnected() {
    ConnectivityManager manager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo info = manager.getActiveNetworkInfo();
    if (info != null && info.isConnected()) {
        return true;
    } else {
        return false;

    }
}

收到该值后,如果该值为真,则继续网络操作。否则,将向用户显示正确的错误消息。

您正试图在UI线程中连接到网络,这是不允许的。要检查活动的internet连接,请使用以下方法

public boolean isConnected() {
    ConnectivityManager manager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo info = manager.getActiveNetworkInfo();
    if (info != null && info.isConnected()) {
        return true;
    } else {
        return false;

    }
}

收到该值后,如果该值为真,则继续网络操作。否则,将向用户显示正确的错误消息。

您正试图在UI线程中连接到网络,这是不允许的。要检查活动的internet连接,请使用以下方法

public boolean isConnected() {
    ConnectivityManager manager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo info = manager.getActiveNetworkInfo();
    if (info != null && info.isConnected()) {
        return true;
    } else {
        return false;

    }
}

收到该值后,如果该值为真,则继续网络操作。否则,将向用户显示正确的错误消息。

您正试图在UI线程中连接到网络,这是不允许的。要检查活动的internet连接,请使用以下方法

public boolean isConnected() {
    ConnectivityManager manager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo info = manager.getActiveNetworkInfo();
    if (info != null && info.isConnected()) {
        return true;
    } else {
        return false;

    }
}

收到该值后,如果该值为真,则继续网络操作。否则将向用户显示正确的错误消息。

听起来您可能需要使用
getActiveNetworkInfo()
调用。stackoverflow上已经有一些帖子对其进行了广泛的记录,因此,与其重复这些帖子,不如看看这些:


听起来您可能需要使用
getActiveNetworkInfo()
调用。stackoverflow上已经有一些帖子对其进行了广泛的记录,因此,与其重复这些帖子,不如看看这些:


听起来您可能需要使用
getActiveNetworkInfo()
调用。stackoverflow上已经有一些帖子对其进行了广泛的记录,因此,与其重复这些帖子,不如看看这些:


听起来您可能需要使用
getActiveNetworkInfo()
调用。stackoverflow上已经有一些帖子对其进行了广泛的记录,因此,与其重复这些帖子,不如看看这些:


我检查了链接,但这仅检查是否打开了wifi或移动数据,而不检查是否可以访问互联网我检查了链接,但这仅检查是否打开了wifi或移动数据,而不检查是否可以访问互联网我检查了链接,但这仅检查是否打开了wifi或移动数据,而不检查是否可以访问互联网已检查链接,但这仅检查wifi或移动数据是否已打开,而不检查互联网是否可访问。因此,我如何在广播接收器中呼叫它,或在更改或丢失互联网连接后检查互联网连接(wifi已连接,但无互联网接入)那么,我如何在广播接收器中呼叫它,或者在它更改或丢失时检查互联网连接(wifi已连接但没有互联网接入),那么我如何在广播接收器中呼叫它,或者在它更改或丢失时检查互联网连接(wifi已连接但没有互联网接入)因此,我如何在广播接收器中呼叫它,或者在它更改或丢失时检查互联网连接(wifi已连接,但没有internet访问)