entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Android: Como saber que una tarea AsyncTask se esta ejecutando

Hola.

Me gustaría saber si una tarea AsyncTask se esta ejecutando.

El siguiente código no es valido debido a que la comprobación la deseo realizar desde una clase distinta a la clase que ha creado el objeto AsyncTask.

LoadMusicInBackground lmib = new LoadMusicInBackground();

if(lmib.getStatus() == AsyncTask.Status.PENDING){
    // My AsyncTask has not started yet
}

if(lmib.getStatus() == AsyncTask.Status.RUNNING){
    // My AsyncTask is currently doing work in doInBackground()
}

if(lmib.getStatus() == AsyncTask.Status.FINISHED){
    // My AsyncTask is done and onPostExecute was called
}

Yo creo el objeto en el MainActivity.java. En otra activity (RSSAvisosActivity.java) deseo comporbar si el objeto asyncTask esta ejecutándose. En caso positivo lanzare un dialogo por pantalla. En caso negativo crearé un nuevo objeto AsyncTask.

Gracias y saludos.

0voto

Villanuevand comentado

Hola @egoitz_gonzalez,
No creo estar entendiendo tú pregunta, pues si lo que deseas es saber cuando se esta ejecutando una Tarea
la respuesta está a la vista, AsyncTask.Status
Tal y como lo colocaste en el código ejemplo...

if(lmib.getStatus() == AsyncTask.Status.RUNNING){ // My AsyncTask is currently doing work in doInBackground() }

No creo, haber respondido tú pregunta... Explicanos un poco mejor.

0voto

egoitz_gonzalez comentado

Hola @Villanuevand

El problema es que yo creo el objeto y lo ejecuto en el MainActivity.java

    CheckNuevosAvisosAsync avisosTask = new CheckNuevosAvisosAsync(this, true);
    avisosTask.execute();

Pero en otra Activity. Concretamente en la RssAvisosActivity deseo mirar si ya se ha terminado de ejecutar el Async creado en el MainActivity.

En caso negativo lanzaré un dialogo.

0voto

Villanuevand comentado

Ok! Ya lo he entendido... pues si no matas MainActivity cuando haces el intent para inflar RssAvisosActivity la tarea debería seguir ejecutandose.
Mira este hilo de stackoverflow [How to check if Async Task is already running] creo que puede ayudarnos.

Saludos

2 Respuestas

2votos

Walcasar Puntos530

Hola
Yo no usaría un AsyncTask ya que AsyncTask corre en el mismo thread que la actividad principal que lo gatillo. En su lugar lo que haría es usar un IntentService que envíe mensajes.

Por ejemplo:

public class test extend IntentService {

    @Override
    protected void onHandleIntent(Intent intent) 
    {
        .
        .
        . Lo que tenga que hacer
        .
        .
        Intent intent = new Intent();
        intent.setAction("INICIO");
        intent.putExtra("Comencé!");
        sendBroadcast(intent);
        .
        . Acá sigo haciendo otras cosas
        .
        Intent intent = new Intent();
        intent.setAction("FIN");
        sendBroadcast(intent);
    }
}

Y desde la clase principal:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        .
        . Lo típico que va por esto lados....
        . 

        IntentFilter filter = new IntentFilter();
        filter.addAction("INICIO");
        filter.addAction("FIN");
        ProgressReceiver x = new ProgressReceiver();
        registerReceiver(x, filter);

        .
        .
        .
    }

    public class ProgressReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals("INICIO")) {
                // Por fin partio
            }
            else if(intent.getAction().equals("TERMINO") {
                // Ya termino
            }
        }
    }
}

Y para ejecutar el IntetService, por ejemplo desde un botón de la actividad principal

Intent intentTest = new Intent(MainActivity.this, intentTest.class);
startService(intentTest);

Y declarar en el manifiesto:

<service android:name=".test"></service>

Como verás el InterService es un Intent que correrá es un propio hilo y como Intent le puedes pasar parámetros como cualquier Intent.

El ejemplo es burdo. La idea es que los mensajes que deseas enviar deben ser únicos para poder estar seguros que son mensajes de nuestra clase.

0voto

egoitz_gonzalez comentado

Gracias!
Esta perfecto. Para monitorizar el progreso del servicio he creado una clase que extiende de BroadcastReceiver

1voto

Quizás podrías establecer la tarea asíncrona como una variable estática privada. Luego, en MainActivity tener un método estático que te devuelva el estado de la tare asíncrona o, mejor para mantener la encapsulación, un método estático que te devuelva true si está corriendo, otro que te devuelva true si está finalizada, etc. El código podría ser algo así:

public class MainActivity extends Activity {
    private static AsyncTask avisoTask = new CheckNuevoAvisoAsync();

    ...

    public static isRunningTask() {
        return avisoTask.getStatus() == AsyncTask.Status.RUNNING;
    }
    ....
}

¿Podría servirte?

Saludos.

0voto

egoitz_gonzalez comentado

Hola.

Si no estoy equivocado esto me serviría para controlar el estado de la tarea asincrona en MainActivity verdad?

En cambio, yo deseo instanciar la tarea CheckNuevoAvisoAsync() en el MainActivity pero controlar su estado en RssAvisosActivity.

También deseio monitorizar el estado a tiempo real. Es decir, deseo saber cuando a terminado.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta