tutorial - Android espera AsyncTask para terminar
thread android studio (4)
Tengo una función, AppHelper.isOnline(Context context)
, llamo en varias partes de mi aplicación para verificar que una sesión no haya expirado antes de realizar 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 AsyncTask
que inicia sesión, haciendo una solicitud de red, que no se puede ejecutar en UI porque de lo contrario obtengo una excepción. Necesito esperar a que termine ANTES de reanudar con el código dentro de if. Cómo puedo hacer esto ?
El problema es que la actividad comienza primero, luego se ejecuta AsyncTask
, por lo que cuando la actividad espera una sesión válida iniciada, se rompe.
La respuesta de Rafiq no funcionó para mí: la aplicación se colgó. Creo que el motivo tiene que ver con la naturaleza de isCancelled (): "Devuelve verdadero si esta tarea se canceló antes de que se completara normalmente". Si la tarea se completa normalmente (es decir, no se cancela), entonces while(!task.isCancelled()) { }
repetirá para siempre.
Para resolver esto, cree un marcador booleano que instale en false
y luego task.onPostExecute()
a true
en task.onPostExecute()
. Luego, haga while(!flag) { }
antes de cambiar de Actividades. Además, si desea dar un ''salto'' al hilo principal para que el proceso AsyncTask sea un poco más rápido, puede intentar esto:
while (!flag) {
try { Thread.sleep(100); }
catch (InterruptedException e) { e.printStackTrace(); }
}
Parece estar funcionando bien para mí.
Tienes dos opciones:
Utilice el método get(long timeout, TimeUnit unit)
AsyncTask
get(long timeout, TimeUnit unit)
así:
task.get(1000, TimeUnit.MILLISECONDS);
Esto hará que el hilo principal espere el resultado de la AsyncTask
a lo sumo 1000 milisegundos (según @ user1028741 comentario: en realidad también hay un método infinitamente en espera - AsyncTask#get()
que también podría hacer el trabajo por usted en algunos casos).
Alternativamente, puede mostrar un cuadro de diálogo de progreso en la tarea asíncrona hasta que finalice. Ver este thread (No es necesario que copie más allá del código). Básicamente, se muestra un cuadro de diálogo de progreso mientras la tarea asíncrona se ejecuta y se oculta cuando finaliza.
Incluso tiene una tercera opción: "si el Thread
es suficiente para sus necesidades, puede usar su método de join
. Sin embargo, si la tarea lleva mucho tiempo, deberá mostrar un cuadro de diálogo de progreso; de lo contrario, recibirá una excepción debido a el hilo principal está inactivo por mucho 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 usando AsyncTask, no esperará allí hasta que la tarea se complete.