Как осуществлять AsyncTask, проверив связность?

Я использую метод, который подтверждал бы связь в Интернет, проблема состоит в том, что активность остается подвешенной мгновенно, в момент которого делается эта проверка, это метод проверки, которую я нашел в Интернете:

Попробуйте осуществлять это, но он не покончил с объектом внутри if и также, как делание этого с одной AsyncTask.

if(isAvailable()){
    alert.showAlertDialog(MainActivity.this, "Verifique su conexión!", 
                         "No hay conexión ", false);                    
} else{      
    // hago otra cosa 
}

Метод isAvaliable() это следующий:

public Boolean isAvailable() {
    try {
        Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
        if(reachable){
            System.out.println("Internet access");
            // return reachable;
            return false;
        }
        else{
            System.out.println("No Internet access");
            return true;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

Заранее спасибо за помощь.

1
задан 13.03.2016, 00:14
3 ответа

Как isAvailable() это синхронный метод, ты не сможешь делать это таким же образом как тебя делает это сейчас, а именно, одним if .. else; так как нужно надеяться, что завершается асинхронное задание перед тем, как продолжать (Хотя @Elenasys он это повторно использует, ясно, что он может reutilizarse, но этот подход отличается, он делает это совсем объединенным).

Для того, чтобы ты знал, намерение AsnycTask он состоит в том, чтобы реализовывать задание на втором плане, которое работает с интерфейсом пользователя перед тем, как начинаться, в течение Вашего прогресса и закончившись. Так что есть много выборов (как уже они объяснили тебе), здесь мы будем использовать это, но чтобы показывать диалог простого прогресса для того, чтобы пользователь знал, что что-то происходит, и что он должен ждать.

Этот класс, который я оставляю внизу, пере-используемый на протяжении твоего проекта. Например перед тем, как сохранять данные в SQLite, ты будешь знать, необходим ли или не в каждом случае он. Ты не должен использовать ее как внутренний класс твоего Activity а как независимый класс.

Прокомментированный код:

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;

/**
 * Verificar internet y proseguir
 */
public class VerificarInternet extends AsyncTask<Void, Void, Boolean> {

    // esta interface define como se procesara el resultado
    // es una forma personalizada de pasar a la AsyncTask tareas que 
    // debe realizar cuando termine, en este caso tiene 2 métodos,
    // que invocaremos según el resultado del ping.
    public interface EntoncesHacer {
        void cuandoHayInternet();
        void cuandoNOHayInternet();
    }

    // variables necesarias, el dialogo de progreso, el contexto de la actividad
    // y una instancia de EntoncesHacer, donde se ejecutan las acciones.
    private ProgressDialog dialog;
    private Context context;
    private EntoncesHacer accion;

    // Constructor, recibe el contexto de la actividad actual,
    // y la instancia de EntoncesHacer
    public VerificarInternet(Context context, EntoncesHacer accion) {
        this.context = context;
        this.accion = accion;
    }

    // corre en el Thread de la UI antes de empezar la tarea en segundo plano.
    // aquí aprovechamos y mostramos el progress...
    @Override
    protected void onPreExecute() {
        // preparamos el cuadro de dialogo
        dialog = new ProgressDialog(context);
        dialog.setMessage("Verificando conexión a Internet");
        dialog.setCancelable(false);
        dialog.show();

        // llamamos al padre
        super.onPreExecute();
    }

    // Esta es la tarea en segundo plano en si.
    @Override
    protected Boolean doInBackground(Void... arg0) {
        // esta es una version modificada de tu codigo original, pero hace
        // mas o menos lo mismo.
        // la diferencia esta en la forma que invoca a ping, intenta mas 
        // veces y espera mas tiempo.
        // si la conexion a internet esta un poco lenta, el otro mecanismo
        // puede dar falsos negativos, este es un poco mas robusto al 
        // reintentar 2 veces y esperar mas tiempo.
        // si la conexion es normal, sera muy rapid
        Runtime runtime = Runtime.getRuntime();
        try {

            Process ipProcess = runtime.exec("ping -c 2 -w 4 google.com");
            int     exitValue = ipProcess.waitFor();
            return (exitValue == 0);

        } catch (IOException e)          { e.printStackTrace(); }
          catch (InterruptedException e) { e.printStackTrace(); }

        return false;
    }

    // Esta es la tarea a realizar cuando termina la tarea en segundo plano
    // aquí de acuerdo al resultado llamaremos a uno u otro método
    // de la interface EntoncesHacer
    @Override
    protected void onPostExecute(Boolean resultado) {
        // llamamos al padre
        super.onPostExecute(resultado);

        // cerramos el cuadro de progreso
        dialog.dismiss();

        // de acuerdo al resultado del ping, se ejecuta una acción o la otra
        if (resultado) {
            accion.cuandoHayInternet();
        } else {
            accion.cuandoNOHayInternet();
        }
    }
}

Потом ты должен использовать ее, таким образом:

// aqui creamos la una instancia de VerificarInternet, que recibe el contexto 
// y la interface interna que se utiliza para decidir que hacer de acuerdo 
// a cada resultado.
VerificarInternet tarea =
        new VerificarInternet(NombreActivity.this, new VerificarInternet.EntoncesHacer() {
            @Override
            public void cuandoHayInternet() {
                // abrimos la nueva ventana.. este es el ELSE de tu if
                Intent intent = new Intent(ActividadPrimaria.this, 
                                              ActividadSecundaria.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                ActividadPrimaria.this.startActivity(intent);
            }

            @Override
            public void cuandoNOHayInternet() {
                Toast.makeText(getApplicationContext(), "Lo sentimos no hay internet", 
                                  Toast.LENGTH_LONG).show();
            }
        });
tarea.execute();

Имей в виду, что твое приложение будет должно использовать следующее в manifest

 <uses-permission android:name="android.permission.INTERNET" />
3
ответ дан 24.11.2019, 14:44
  • 1
    большое спасибо @rnd ты спас меня, функционируй верно, измени какие-то изменчиво, из-за которого я ped и # 237; в который они были конечными, но все видимо функционирует в совершенство – JESUS ESPINOSA 13.03.2016, 18:12
  • 2
    Превосходный ответ. Despué s двух añ вы и todaví в sigue будучи очень ú til. – Daniel Sanchez 30.01.2019, 23:04

AsynTask позволяет тебе реализовывать операции на втором плане (background) и они печатать (обновлять их) в главном трэде (UI thread).

Работает с 3 типами: Params, Progress и Result.

Работает в 4 шагах: onPreExecute (), doInBackground (Params...), onProgressUpdate (Progress...) и Онпостексекуте (Result):

официальная Ссылка AsynTask: Соединил

Ссылок interГ©s в кастильце

Краткий пример как implemtarla.

private class EjemploAsyncTask extends AsyncTask<Void,Integer,Boolean>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // por ejemplo: progressBar.setMax(100); progressBar.setProgress(0);
        // ESTE SE EJECUTA EN EL HILO PRINCIPAL
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        // RECIBES PARAMETROS Y TRATAS TAREA, ESTO SE EJECUTA EN UN HILO APARTE
        // RETORNAS 
       return true;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        // por ejemplo: progressBar.setProgress(values[0].intValue());
        // ESTE SE EJECUTA EN EL HILO PRINCIPAL
    }

    @Override
    protected void onPostExecute(Boolean resultado) {
        super.onPostExecute(resultado);
        // TAREA REALIZADA, ESTO SE EJECUTA EN EL HILO PRINCIPAL
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        // TAREA ASÍNCRONA CANCELADA
        // ESTE SE EJECUTA EN EL HILO APARTE
    }

}
1
ответ дан 24.11.2019, 14:44

Asynctask предназначается, чтобы управлять несколькими заданиями, Threads, в твоем случае podrГ-схвати использовать Гєnicamente runOnUiThread(), и не serГ - в такой необходимый использовать Asynctask :

    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {

            if(isAvailable()){
                alert.showAlertDialog(MainActivity.this, "Verifique su conexión!", "No      hay conexión ", false);
            } else{
                //....hago otra cosa 
            }

        }

     });

, Если ты предпочитаешь использовать Asynctask , эту serГ - в нее implementaciГіn:

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> {

            @Override
            protected Boolean doInBackground(Void... params) {

           //Ejecutas tu método para comprobar conexión, el cual regresa un valor boleano.
                return isAvailable(); 

            }

            @Override
            protected void onPostExecute(Boolean isAvalable) {

            //Se recibe el valor boleano del método doInBackground().
            // Se puede abrir el Dialogo en el Thread principal. 
                if(isAvalable){     
                     alert.showAlertDialog(MainActivity.this, "Verifique su conexión!", "No      hay conexión ", false);              
                } else{
                    //....hago otra cosa               
                }
            }

            @Override
            protected void onPreExecute() {}

            @Override
            protected void onProgressUpdate(Void... values) {}

        }

, Чтобы выполнять Asynctask serГ - в с:

    new AsyncConnectTask().execute();

Замечает: Немного важно комментирования состоит в том, что чтобы обнаруживать, если ты имеешь доступ к Интернету, возможно реализовывать с mГ©todo:

      public static boolean isOnline() {
                NetworkInfo networkInfo = getManager().getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
            }

, который ты используешь podsrГ, - чтобы не удаваться в каких-то версиях операционной системы, это mГ©todo тот, которого я описываю в моем ответе" обнаруживать, когда есть доступный Интернет в Android? "

1
ответ дан 24.11.2019, 14:44
  • 1
    спасибо @Elenasys дело в том, что он был должен помещать это насильно внутри bundle, и я смог приспосабливать bundle приятеля и # 241; ero rnd... привет – JESUS ESPINOSA 13.03.2016, 18:15

Теги

Похожие вопросы