【问题标题】:Check for Active internet connection Android检查活动的互联网连接 Android
【发布时间】:2013-07-17 01:35:28
【问题描述】:

我正在尝试在我的应用程序中编写一个部分,以区分活动 Wifi 连接和互联网的实际连接。使用连接管理器确定是否有活动的 Wifi 连接非常简单,但是每次我尝试测试在连接 Wifi 但没有互联网连接时是否可以连接到网站时,我最终会陷入无限循环。 我曾尝试 ping 谷歌,但结果相同:

Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = 5;
try {
    returnVal = p1.waitFor();
} catch (InterruptedException e) {
    e.printStackTrace();
}
boolean reachable = (returnVal==0);
return reachable;

我也试过这段代码:

if (InetAddress.getByName("www.xy.com").isReachable(timeout))
{    }
else
{    }

但我无法让 isReachable 工作。

【问题讨论】:

标签: java android networking wifi ping


【解决方案1】:

我用这个:

public static void isNetworkAvailable(Context context){
    HttpGet httpGet = new HttpGet("http://www.google.com");
    HttpParams httpParameters = new BasicHttpParams();
    // Set the timeout in milliseconds until a connection is established.
    // The default value is zero, that means the timeout is not used.
    int timeoutConnection = 3000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    // Set the default socket timeout (SO_TIMEOUT)
    // in milliseconds which is the timeout for waiting for data.
    int timeoutSocket = 5000;
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
    try{
        Log.d(TAG, "Checking network connection...");
        httpClient.execute(httpGet);
        Log.d(TAG, "Connection OK");
        return;
    }
    catch(ClientProtocolException e){
        e.printStackTrace();
    }
    catch(IOException e){
        e.printStackTrace();
    }

    Log.d(TAG, "Connection unavailable");
}

它来自另一个 stackoverflow 答案,但我找不到。

编辑:

终于找到了:https://stackoverflow.com/a/1565243/2198638

【讨论】:

  • 如果我 timeoutConnection = 2000 和 int timeoutSocket = 3000;
【解决方案2】:

这样查询一个网站:

通过将以下方法添加到您的类中,让您的类实现 AsyncTaskCompleteListenere<Boolean>

@Override
public void onTaskComplete(Boolean result) {
    Toast.makeText(getApplicationContext(), "URL Exist:" + result, Toast.LENGTH_LONG).show();
   // continue your job
}

向您的类添加一个简单的testConnection 方法,以便在您要检查连接时调用:

public void testConnection() {
        URLExistAsyncTask task = new URLExistAsyncTask(this);
        String URL = "http://www.google.com";
        task.execute(new String[]{URL});
    }

最后是 URLExistAsyncTask 类,它作为异步(后台)任务执行连接测试,并在完成后回调您的 onTaskComplete 方法:

  public class URLExistAsyncTask extends AsyncTask<String, Void, Boolean> {
        AsyncTaskCompleteListenere<Boolean> callback;

        public URLExistAsyncTask(AsyncTaskCompleteListenere<Boolean> callback) {
            this.callback = callback;
        }

        protected Boolean doInBackground(String... params) {
            int code = 0;
            try {
                URL u = new URL(params[0]);
                HttpURLConnection huc = (HttpURLConnection) u.openConnection();
                huc.setRequestMethod("GET");
                huc.connect();
                code = huc.getResponseCode();
            } catch (IOException e) {
                return false;
            } catch (Exception e) {
                return false;
            }

            return code == 200;
        }

        protected void onPostExecute(Boolean result){
              callback.onTaskComplete(result);
        }
    }

【讨论】:

    【解决方案3】:

    它确实对我有用:

    验证网络可用性:

    private Boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager 
              = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
    }
    

    验证互联网访问:

    public Boolean isOnline() {
        try {
            Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
            int returnVal = p1.waitFor();
            boolean reachable = (returnVal==0);
            return reachable;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
    

    【讨论】:

    • 警告使用 ping 方法!这在我测试过的大多数设备上都很好用,但在 S4 Mini 上就不行了。
    • 具体是哪个异常?
    • 这有时会冻结 UI,因为它在 UI 线程上运行。
    【解决方案4】:

    为了检查 android 设备是否有活动连接,我使用下面的 hasActiveInternetConnection() 方法(1)尝试检测网络是否可用,(2)然后连接到 google.com 以确定网络是否可用活跃。

    public static boolean hasActiveInternetConnection(Context context) {
        if (isNetworkAvailable(context)) {
            if (connectGoogle()) {
                return true;
            } else { //one more try
                return connectGoogle();
            }   
        } else {
            log("No network available! (in hasActiveInternetConnection())");
            return false;
        }
    }
    
    
    public static boolean isNetworkAvailable(Context ct) {
        ConnectivityManager connectivityManager = (ConnectivityManager) ct.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
    
    
    public static boolean connectGoogle() {
        try {
            HttpURLConnection urlc = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(10000); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);     
        } catch (IOException e) {
            log("IOException in connectGoogle())");
            return false;
        }
    }
    

    【讨论】:

      【解决方案5】:

      这里有一些现代代码使用AsynTask 来解决当您尝试在主线程上连接时 android 崩溃的问题,并为用户引入带有冲洗和重复选项的警报。

      class TestInternet extends AsyncTask<Void, Void, Boolean> {
          @Override
          protected Boolean doInBackground(Void... params) {
              try {
                  URL url = new URL("http://www.google.com");
                  HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                  urlc.setConnectTimeout(3000);
                  urlc.connect();
                  if (urlc.getResponseCode() == 200) {
                      return true;
                  }
              } catch (MalformedURLException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
                  return false;
              } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                  return false;
              }
              return false;
          }
      
          @Override
          protected void onPostExecute(Boolean result) {
              if (!result) { // code if not connected
                  AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                  builder.setMessage("An internet connection is required.");
                  builder.setCancelable(false);
      
                  builder.setPositiveButton(
                          "TRY AGAIN",
                          new DialogInterface.OnClickListener() {
                              public void onClick(DialogInterface dialog, int id) {
                                  dialog.cancel();
                                  new TestInternet().execute();
                              }
                          });
      
      
                  AlertDialog alert11 = builder.create();
                  alert11.show();
              } else { // code if connected
                  doMyStuff();
              }
          }
      }
      

      ...

      new TestInternet().execute();
      

      【讨论】:

      • 这很好,但是如果有 WiFi 连接而无法访问互联网,则需要很长时间,有什么解决方法吗?
      【解决方案6】:

      我确实使用了这种方法。它对我有用!适合想要真正上网的人!

      public boolean isOnline() {
          try {
              HttpURLConnection httpURLConnection = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
              httpURLConnection.setRequestProperty("User-Agent", "Test");
              httpURLConnection.setRequestProperty("Connection", "close");
              httpURLConnection.setConnectTimeout(10000);
              httpURLConnection.connect();
              return (httpURLConnection.getResponseCode() == 200);
          } catch (IOException e) {
              e.printStackTrace();
              return false;
          }
      }
      

      每次都这样做!只需使用接收器 和=&gt;

      httpURLConnection.getResponseCode() == 200 
      

      这意味着互联网已连接!

      【讨论】:

      • 为了改进这个答案,我会注意到 connect 不能从主线程调用,setReadTimeout 也很好。
      【解决方案7】:

      您可以通过创建 new parallel thread 来计算时间:

      final class QueryClass {
          private int responseCode = -1;
           private   String makeHttpRequest(URL url) throws IOException {
                  String jsonResponse = "";
                  if(url == null) {
                      return null;
                  }
      
                  HttpURLConnection  urlConnection = null;
                  InputStream inputStream = null;
                  try {
                      urlConnection = (HttpURLConnection) url.openConnection();
                      urlConnection.setRequestMethod("GET");
                      urlConnection.setReadTimeout(5000 );
                      urlConnection.setConnectTimeout(5000 );
                      Thread thread = new Thread() {
                          @Override
                          public void run() {
                              super.run();
                              try {
                                  sleep(5000);
                              } catch (InterruptedException e) {
                                  e.printStackTrace();
                              }
                              if(responseCode == -1) {
                                  //Perform error message
                              Intent intent = new Intent(context,ErrorsActivity.class);
                              intent.putExtra("errorTextMessage",R.string.errorNoInternet);
                              intent.putExtra("errorImage",R.drawable.no_wifi);
                              context.startActivity(intent);
                              }
                          }
                      };
                      thread.start();
                      urlConnection.connect();
                       responseCode = urlConnection.getResponseCode();
                      if (responseCode == 200) {
                          inputStream = urlConnection.getInputStream();
                          jsonResponse = readFromStream(inputStream);
      
                      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 2012-04-16
        • 2016-08-28
        • 2012-02-21
        • 2016-01-16
        • 2015-01-02
        相关资源
        最近更新 更多