正在检查另一个线程上的互联网连接



当我按下登录按钮时,应用程序冻结了一段时间,因为它检查了主线程上的互联网连接。 如何在后台线程或新线程中执行此操作,它们之间有什么区别(后台线程和另一个新线程(。

我的互联网检查功能:

public Boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return false;
}

您基本上是在尝试执行PING命令来检查您是否具有真正的互联网连接,而不仅仅是网络连接。在这种情况下,它使用网络,因此您最终会得到一个 NetworkOnMainThreadException .

实现此目的的方法之一是创建一个回调方法,该方法从后台线程返回PING的结果。

下面的代码重申了我的意思:

interface ResultCallback {
   void onComplete(boolean result);
}
class checkInternet extend AsyncTask<., ., Boolean> {
  ResultCallback callback;
  public static checkInternet(ResultCallback callback) {
    this.callback = callback;
  }
  void doInBackGround() {
     return isOnline();
  }
  onPostExecute(Boolean result) {
    callback.onComplete(result);
  }
}

有一个功能

void performCheckOnInternet(ResultCallback callback) {
    new checkInternet(callback).execute();
  }

现在,您可以调用此异步任务,如下所示:

performCheckOnInternet(new ResultCallback {
    void onComplete(boolean result) {
       //do your stuff here 
    }
});

你真的需要检查数据是否真的在流动吗?如果没有,您可以使用这个(更简单的(分配:

public static boolean hasInternetConnection(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}

最新更新