Как использовать асинхронную задачу приводит к выражению if - PullRequest
1 голос
/ 19 октября 2019

Я хочу проверить интернет-соединение с определенным веб-сайтом, прежде чем запускать метод в моем onClick. Проведя некоторое исследование, я обнаружил, что эта ссылка, на которую был принят ответ, показала мне, как это сделать Проверка интернет-соединения Android лучше проблема заключается в том, что метод выдает ошибку android os networkonmain threadexception, я провел больше исследований и выяснил, что такоеоперация должна была быть выполнена в асинхронной задаче. Как я могу сделать это и по-прежнему использовать результат в моем методе кнопки 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; 
       }
   }

Как бы я использовал приведенный выше код в асинхронной задаче и использовал результаты в отношении отсутствия интернет-соединенияили нет в операторе if в методе oncreate?

Ранее я также нашел это Как проверить доступ в Интернет на Android? InetAddress никогда не отключается , но я не понимаю, какой код я бы использовал для получения результатов асинхронной задачи и использования их в oncreate в onClick.

1 Ответ

0 голосов
/ 19 октября 2019

Вы можете запустить AsyncTask для проверки доступности интернета в onClick() и в onPostExecute() AsyncTasks вы можете обновить пользовательский интерфейс на основе результата.

Так как AsyncTask.execute() принимает только один параметрВы можете использовать класс-оболочку для передачи адреса , порта и 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);
}
...