Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android wait asynctask para terminar

Tengo una función, AppHelper.isOnline(Context context) , llamo en varias partes de mi aplicación para comprobar que una sesión no tiempo de espera antes de hacer una solicitud HTTP.

 public void onClick(View v) { Intent intent = null; switch (v.getId()) { case R.id.buttonPagamenti: if (AppHelper.isOnline(this)) { //here AppHelper.isOnline should have finished it's async task intent = new Intent(this, OrdineCreaActivity.class); this.startActivityForResult(intent, R.id.buttonPagamenti); } break; ... 

Dentro de AppHelper.isOnline() , estoy ejecutando una tarea asíncrona que inicia sesión, por lo tanto, hacer una solicitud de red, que no se puede ejecutar en la interfaz de usuario, porque de lo contrario tengo una excepción. Necesito esperar a que termine antes de reanudar con el código dentro de la if. Cómo puedo hacer esto ?

  • Dibujo de un gradiente en Libgdx
  • Cómo dividir Linear Layout en dos columnas?
  • ¿Cómo capturar ambas cámaras frontales y traseras en el Galaxy S4 simultáneamente?
  • BSSID vs dirección MAC?
  • Android: EditText.setInputType () cómo configurar el correo electrónico pero no sugerir automáticamente
  • El título de ViewPager no aparece hasta que lo deslice
  • El problema es que la actividad comienza primero, luego se ejecuta la asincronización, por lo que cuando la actividad espera una sesión válida, se rompe.

  • Agente de usuario android
  • La compilación AAPT2 falló: Dimen no válido en Android 3.0 Canary 1
  • Cómo detener logcat de desplazamiento en Android Studio
  • ¿Por qué es posible escribir una matriz booleana en un paquete pero no en un booleano?
  • Cómo detener un dispositivo Android de ser cargado mediante programación?
  • ¿Se puede acceder a los valores definidos en MANIFEST.MF mediante programación?
  • 4 Solutions collect form web for “Android wait asynctask para terminar”

    Tiene dos opciones:

    Utilice el método AsyncTask get(long timeout, TimeUnit unit) así:

     task.get(1000, TimeUnit.MILLISECONDS); 

    Esto hará que su hilo principal espere el resultado de la AsyncTask a lo sumo 1000 milisegundos (como por @ user1028741 comentario: en realidad también hay infinetly método de espera – AsyncTask#get() que también podría hacer el trabajo para usted en algunos casos).

    Alternativamente, puede mostrar un diálogo de progreso en la tarea asíncrona hasta que finalice. Vea este hilo (No hay necesidad de que copie el código pasado). Básicamente un diálogo de progreso se muestra mientras se ejecuta la tarea asíncrona y se oculta cuando termina.

    Usted tiene incluso la tercera opción: "si Thread es suficiente para sus necesidades sólo puede utilizar su método de join embargo, si la tarea está tomando un largo tiempo, todavía tendrá que mostrar un diálogo de progreso, de lo contrario obtendrá una excepción debido a Siendo el hilo principal inactivo durante demasiado tiempo.

    Intenta usar

     if (AppHelper.isOnline(this)) { while(!task.isCancelled()){ // waiting until finished protected String[] doInBackground(Void... params) } intent = new Intent(this, OrdineCreaActivity.class); this.startActivityForResult(intent, R.id.buttonPagamenti); } 

    Para obtener más información, lea http://developer.android.com/reference/android/os/AsyncTask.html

     intent = new Intent(this, OrdineCreaActivity.class); context.startActivityForResult(intent, R.id.buttonPagamenti); 

    Escriba las líneas anteriores en onPostExecute () de usted AysncTask. Porque si estamos utilizando AsyncTask que no va a esperar hasta que la tarea completa.

    La respuesta de Rafiq no funcionó para mí – la aplicación colgó. Creo que la razón tiene que ver con la naturaleza de isCancelled (): "Devuelve true si esta tarea se canceló antes de completarse normalmente." Si la tarea se completa normalmente (es decir, no se cancela), while(!task.isCancelled()) { } repetirá para siempre.

    Para solucionar esto crea una bandera booleana que instatiate a false y luego task.onPostExecute() a true en task.onPostExecute() . Luego haz while(!flag) { } antes de cambiar de Actividades. Además, si desea darle al hilo principal un "descanso" para permitir que el proceso AsyncTask sea un poco más rápido, puede probarlo:

     while (!flag) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } 

    Parece estar funcionando bien para mí.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.