Quiero comprobar la conexión a Internet con un sitio web en particular antes de iniciar un método en mi onClick. Después de investigar un poco, encontré este enlace cuya respuesta aceptada me mostró cómo hacerlo La conectividad a Internet de Android comprueba un mejor método el problema es que aunque el método produce un error en el sistema operativo Android, investigué más y descubrí que era necesario ejecutar una operación de este tipo en una tarea asíncrona. ¿Cómo puedo hacer esto y seguir usando el resultado en el método onClick de mi botón?

Este es mi código actual en onCreate.

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

A continuación se muestra el código para verificar la conexión a Internet con el sitio.

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

¿Cómo usaría el código anterior en una tarea asíncrona y usaría los resultados en cuanto a si no hay conexión a Internet o no en la declaración if en el método oncreate?

Anteriormente también encontré esto Cómo comprobar Internet acceso en Android? InetAddress nunca agota el tiempo de espera pero no entiendo qué código usaría para derivar los resultados de la tarea asíncrona y usarlos en la creación en onClick.

1
Yayayaya 19 oct. 2019 a las 21:43

1 respuesta

La mejor respuesta

Puede iniciar una AsyncTask para verificar la disponibilidad de Internet en onClick() y en AsyncTasks onPostExecute() puede actualizar la interfaz de usuario según el resultado.

Dado que AsyncTask.execute() solo toma un parámetro, puede usar una clase contenedora para pasar dirección , puerto y 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;
}

Código 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();
        }
    }
}

Empiece en onClick() así:

@Override
public void onClick(View view) {
    InetAddress inetAddress = new InetAddress("18.184.67.80", 443, 1000);
    new InternetCheckTask().execute(inetAddress);
}
0
Bö macht Blau 19 oct. 2019 a las 19:09