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 ?

  • Mejor manera de evitar la acumulación de tostadas en Android
  • Tomar captura de pantalla con el diálogo
  • Java.text.ParseException: Fecha inestable: "2014-06-04" (en el desplazamiento 5)
  • Imagebutton me da error: Falta el atributo contentDescription en la imagen
  • Cómo obtener la posición actual de ViewFlipper
  • ListView: TextView con LinkMovementMethod hace que el elemento de lista sea unclickable?
  • 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.

  • Excepción de puntero nulo de SQLiteOpenHelper.getWriteableDatabase () en Android
  • Visualización de imágenes de almacenamiento en base a firebase en un RecyclerView
  • Android: la aplicación de indexación de aplicaciones de Firebase no se muestra en las sugerencias de autocompletar de google
  • Git - Android Studio ya no me permite confirmar los cambios y empujar a GitHub
  • ¿Quieres eliminar los recursos no utilizados con Android Studio?
  • SurfaceView, SurfaceTexture y MediaPlayer no pueden reproducir mi video en android
  • 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.