Esperando hasta que la tarea asincrónica termine su trabajo

85

Soy muy nuevo en la programación y tengo algunas dudas.

Tengo un AsyncTaskque es lo que llamo RunInBackGround.

y comienzo este proceso como:

new RunInBackGround().execute();

Pero deseo esperar hasta que esta llamada termine de ejecutarse, antes de continuar con las otras declaraciones de código.

¿Cómo puedo hacer eso?

¿Hay alguna forma de hacerlo?

hombre murciélago
fuente
2
El punto de AsyncTask es que es asincrónico, lo que significa que no está sincronizado con el resto del código.
Gjordis
3
Puede usar su método onPostExecute () de AsyncTask para obtener una devolución de llamada en su clase.
DcodeChef
5
realmente no quieres esperar hasta que termine. Lo que quieres es saber cuándo termina.
njzk2
3
@DcodeChef es el único que entendió lo que quería en la pregunta.
Please_Dont_Bully_Me_SO_Lords
1
Creo que esta es la respuesta que busca stackoverflow.com/questions/13079645/…
user3362415

Respuestas:

130

espere hasta que esta llamada termine su ejecución

Deberá llamar al método AsyncTask.get () para recuperar el resultado y esperar hasta que la doInBackgroundejecución no se complete. pero esto congelará el hilo de la IU principal si no llama al método get dentro de un hilo .

Para recuperar el resultado en el hilo de la interfaz de usuario, comience AsyncTaskcomo:

String str_result= new RunInBackGround().execute().get();
ρяσѕρєя K
fuente
3
Entonces, ¿cómo esperar el resultado y no bloquear el hilo principal de la interfaz de usuario? digamos que el código espera el resultado, pero mientras tanto, ¡la barra de progreso sigue funcionando!
Muhammad Naderi
2
@MuhammadNaderi: se usa AsyncTasksin getmétodo y en AsyncTask onPostExecutese llama al método que proporciona u resultados en el hilo principal de la interfaz de usuario
ρяσѕρєя K
3
Seguro que esta es una solución alternativa, que he estado usando durante un tiempo, pero a veces necesito que el código espere el asynctask, algo como awaitin c#, y no bloquee el hilo principal, por supuesto
Muhammad Naderi
2
@ ρяσѕρєяK gracias, un millón de gracias. no tienes idea de cuánto me estiré el pelo por este problema, sin embargo, con solo un .get () resolvió (bromeas) solo uno .get () !!!!!
Code_Worm
¿Cómo puede usar AsyncTask y evitar usar get () para evitar que la interfaz de usuario se congele?
Arjun Issar
36

Aunque de manera óptima sería bueno si su código se puede ejecutar en paralelo, puede darse el caso de que simplemente esté usando un hilo para no bloquear el hilo de la interfaz de usuario, incluso si el flujo de uso de su aplicación tendrá que esperar.

Tienes prácticamente 2 opciones aquí;

  1. Puede ejecutar el código que desea esperar, en la propia AsyncTask. Si tiene que ver con la actualización de la interfaz de usuario (hilo), puede usar el método onPostExecute. Esto se llama automáticamente cuando se realiza el trabajo en segundo plano.

  2. Si por alguna razón se ve obligado a hacerlo en la Actividad / Fragmento / Lo que sea, también puede convertirse en un oyente personalizado, que transmite desde su AsyncTask. Al usar esto, puede tener un método de devolución de llamada en su Actividad / Fragmento / Lo que sea que solo se llame cuando lo desee: también conocido como cuando su AsyncTask haya terminado con lo que tuvo que esperar.

Stefan de Bruijn
fuente
6
Esta es una excelente respuesta, debería ser la aceptada. También aquí hay una muestra de cómo lograr esto con AsyncTasks: stackoverflow.com/questions/12575068/…
José González
en su segunda opción, Mientras tanto, lanza intent a su receptor, el hilo principal se reanudará correctamente. OP no necesita eso.
LincyTonita
16

En su AsyncTaskagregar un ProgressDialog como:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

puede establecer el mensaje en un onPreExecute()método como:

this.dialog.setMessage("Processing..."); 
this.dialog.show();

y en tu onPostExecute(Void result)método descarta tu ProgressDialog.

KDeogharkar
fuente
15

AsyncTask tiene cuatro métodos.

onPreExecute  -- for doing something before calling background task in Async

doInBackground  -- operation/Task to do in Background

onProgressUpdate  -- it is for progress Update

onPostExecute  -- this method calls after asyncTask return from doInBackground.

puede llamar a su trabajo en onPostExecute()llamadas después de regresar dedoInBackground()

onPostExecute es lo que necesita implementar.

AndroidGeek
fuente
1

Creo que la forma más sencilla es crear una interfaz para obtener los datos de onpostexecute y ejecutar la Ui desde la interfaz:

Crea una interfaz:

public interface AsyncResponse {
    void processFinish(String output);
}

Entonces en asynctask

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

Entonces en tu actividad principal

@Override
public void processFinish(String data) {
     // do things

}
Nearyuk
fuente