Soy muy nuevo en la programación y tengo algunas dudas.
Tengo un AsyncTask
que 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?
Respuestas:
Deberá llamar al método AsyncTask.get () para recuperar el resultado y esperar hasta que la
doInBackground
ejecució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
AsyncTask
como:String str_result= new RunInBackGround().execute().get();
fuente
AsyncTask
singet
método y en AsyncTaskonPostExecute
se llama al método que proporciona u resultados en el hilo principal de la interfaz de usuarioawait
inc#
, y no bloquee el hilo principal, por supuestoAunque 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í;
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.
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.
fuente
En su
AsyncTask
agregar 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 tuProgressDialog
.fuente
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.
fuente
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 }
fuente