【问题标题】:doing check internet connection on another thread?在另一个线程上检查互联网连接?
【发布时间】:2018-10-25 14:43:10
【问题描述】:

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

我的上网查询功能:

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;
}

【问题讨论】:

  • 您要检查互联网连接是否打开了用户数据?或者数据是否真的在流动?
  • the app freezes for a while because it checks internet connection on the main thread。只能从与主线程不同的线程检查 Internet。由于ipProcess.waitFor();,您的应用程序冻结
  • 你最好把所有的东西都放在一个线程中,如果线程完成了你启用登录按钮。

标签: android multithreading android-studio


【解决方案1】:

您基本上是在尝试执行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 
    }
});

【讨论】:

  • 谢谢,我认为这会起作用,但它非常复杂,我无法将所有代码应用于我的所有活动(登录、注册和重置密码活动将检查互联网)。你不能给我一个简短的方法来检查后台线程中的互联网连接吗?
  • 网络层使用什么库? Retrofit2?HttpURLConnection?如果您使用的是 Retrofit2,有一个简单的方法可以处理这个问题。如果没有互联网连接,它的 onFailure 方法会立即调用,您可以在那里检查异常类型以进一步检查您是否有网络中断。
【解决方案2】:

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

public static boolean hasInternetConnection(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2011-04-15
    • 2017-03-16
    • 2014-02-08
    • 2012-06-12
    相关资源
    最近更新 更多