如何在 if 语句中使用异步任务结果

How to use async task results in if statement

我想在我的 onClick 中启动方法之前检查与特定网站的 Internet 连接。在做了一些研究后,我发现这个link谁接受了答案告诉我如何做到这一点问题是虽然该方法产生错误android os networkonmainthreadexception,我做了更多研究并发现在异步任务中要求这样的操作是运行。我怎样才能做到这一点,并仍然在我的按钮 onClick 方法中使用结果。

这是我在 onCreate 中的当前代码。

  @Override
  public void onClick(View view) {
      if (isInternetAvailable("18.184.67.80", 443, 1000)) {
          Method() ;
      } else {
          Toast.makeText(getApplicationContext)) , "Internet not available" ).show;
      }
  }

下面是检查网站互联网连接的代码

   public boolean isInternetAvailable(String address, int port, int timeoutMs) {
       try {
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress(address, port);

            sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
            sock.close();

            return true;

       } catch (IOException e) { 
            return false; 
       }
   }

如何在异步任务中使用上述代码,并在 oncreate 方法的 if 语句中使用结果判断是否没有互联网连接?

早些时候我也发现了这个 How to check internet access on Android? InetAddress never times out 但我不明白我会使用什么代码从异步任务中导出结果并在 onClick 下的 oncreate 中使用它们。

您可以在 onClick() 中启动 AsyncTask 检查 Internet 可用性,并且在 AsyncTasks 的 onPostExecute() 中您可以根据结果更新 UI。

由于AsyncTask.execute()只接受一个参数,你可以使用包装器class传入地址端口timeOutMs:

class InetAddress{
    public InetAddress(String address, int port, int timeoutMs){
        this.address = address;
        this.port = port;
        this.timeOutAfterMs = timeoutMs;
    }

    String address;
    int port;
    int timeOutAfterMs;
}

AsyncTask代码:

class InternetCheckTask extends AsyncTask<InetAddress, Void, Boolean> {

    @Override
    protected Boolean doInBackground(InetAddress... inetAddresses) {
        try {
            InetAddress inetAddress = inetAddresses[0];
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress(inetAddress.address, inetAddress.port);

            sock.connect(sockaddr, inetAddress.timeOutAfterMs); // This will block no more than timeoutMs
            sock.close();

            return true;

        } catch (IOException e) { return false; }
    }

    @Override
    protected void onPostExecute(Boolean isInternetAvailable) {
        // Note: this will be executed on the main thread
        if(isInternetAvailable){
            doSomething();
        }
        else{
            Toast.makeText(MainActivity.this , "Internet not available", Toast.LENGTH_SHORT ).show();
        }
    }
}

onClick() 开始,像这样:

@Override
public void onClick(View view) {
    InetAddress inetAddress = new InetAddress("18.184.67.80", 443, 1000);
    new InternetCheckTask().execute(inetAddress);
}