互联网连接问题

时间:2017-11-01 10:00:15

标签: android wifi android-wifi internet-connection hotspot

在我的应用程序中,我使用以下方法检查互联网连接:

public static boolean isOnline(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

现在,在活动中,我正在检查互联网连接,如下所示:

if (Constant.isOnline(mContext))
   loadNotificationList();
else
   Constant.displayToast(mContext, getResources().getString(R.string.msg_internet));

现在,如果MobileData或Wi-Fi关闭,我会收到烤面包消息。没关系。 但是,问题出在以下情况中:

==>我正在使用其他设备的Wi-Fi,其中热点已打开,我的设备已连接到它。现在,我已经关闭了另一台设备的移动数据。 这意味着:我没有互联网接入。 但是,我仍然从方法中获得 true isOnline()

所以,我认为该方法仅检查状态。如果我想检查互联网访问是否可用,该怎么办?

感谢。

3 个答案:

答案 0 :(得分:1)

我在项目中使用了以下方法。我上了一堂课CheckInternet。我们的想法是使用isNetworkAvailable()检查您是否已连接到任何网络。如果是,请通过ping hasActiveInternetConnection()

检查服务器并检查响应(最好是Google)来检查互联网连接
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class CheckInternet {

    private static final String TAG = CheckInternet.class.getSimpleName();
    protected Context context;

    public CheckInternet(Context context) {
        this.context = context;
    }

    private static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    public static boolean hasActiveInternetConnection(Context context) {
        if (isNetworkAvailable(context)) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());
                urlc.setRequestProperty("User-Agent", "Test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500);
                urlc.connect();

                return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);
            } catch (IOException e) {
                Log.e(TAG, "Error checking Internet Connection - " + e);
            }
        } else {
            Log.d(TAG, "No network available!");
        }
        return false;
    }
}

您可以通过线程在任何地方调用此类(因为直接调用它会抛出 NetworkOnMainThreadException )。以下是我在片段中调用它的方式。

Thread th = new Thread(new Runnable() {
    public void run() {
        Boolean b = CheckInternet.hasActiveInternetConnection(getContext());

        if (b) {
            //Net is working, do whatever
        } else {
            //Net is NOT working
        }
    }
});
th.start();

答案 1 :(得分:0)

  

如果MobileData或wi-fi关闭,我会收到toast message

 if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }

<强>问题

  • 您的 return 类型

你应该这样试试,

 public static boolean isOnline(Context context) 
        {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo == null)
                return false;
            if (!netInfo.isConnected())
                return false;
            if (!netInfo.isAvailable())
                return false;
        return true;
       }

答案 2 :(得分:0)

以下网络方法是否可用。

    public static boolean isNetworkAvailable(Context mContext) {

    ConnectivityManager cm = (ConnectivityManager) mContext
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        Log.e("Network Testing", "***Available***");
        return true;
    }
    Log.e("Network Testing", "***Not Available***");
    return false;
}

在活动检查互联网连接。

  if(Utils.isNetworkAvailable(mContext)){

        isInternetAvailable = true;

    }else{
        isInternetAvailable = false;
    }