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 ?

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.

  • ¿Debo usar setDaemon () en android?
  • ¿Una manera fácil de detectar dónde se está bloqueando el hilo de ui en Android?
  • ¿Cómo detener un hilo?
  • ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
  • CancelaciónExcepción al utilizar ExecutorService
  • Los animadores sólo se pueden ejecutar en los subprocesos Looper en Sherlock Action Bar
  • Espere un hilo antes de continuar en Android
  • Android- Thread.join () hace que la aplicación se bloquee
  • 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.