2011-09-28 17 views
35

Este es mi código:Android, AsyncTask, ¿comprobar el estado?

En onCreate:

new LoadMusicInBackground().execute(); 

Luego, hacia el final de mi clase principal que tengo este código

/** Helper class to load all the music in the background. */ 
class LoadMusicInBackground extends AsyncTask<Void, String, Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 

     soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100); 
     soundPoolMap = new HashMap<Integer, Integer>(); 

     soundPoolMap.put(A1, 
       soundPool.load(GameScreen_bugfix.this, R.raw.a, 1)); 
     soundPoolMap.put(A3, 
       soundPool.load(GameScreen_bugfix.this, R.raw.b, 1)); 
     soundPoolMap.put(A5, 
       soundPool.load(GameScreen_bugfix.this, R.raw.c_s, 1)); 
     soundPoolMap.put(A6, 
       soundPool.load(GameScreen_bugfix.this, R.raw.d, 1)); 
     soundPoolMap.put(A8, 
       soundPool.load(GameScreen_bugfix.this, R.raw.e, 1)); 
     soundPoolMap.put(A10, 
       soundPool.load(GameScreen_bugfix.this, R.raw.f_s, 1)); 
     soundPoolMap.put(A12, 
       soundPool.load(GameScreen_bugfix.this, R.raw.g_s, 1)); 
     soundPoolMap.put(wrong, 
       soundPool.load(GameScreen_bugfix.this, R.raw.wrong2, 1)); 

     publishProgress(""); 
     Log.v("SOUNDPOOL", "" + soundPoolMap); 
     return (null); 
    } 

    @Override 
    protected void onProgressUpdate(String... item) { 
     // text1.setText(item[0]); 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     //Toast.makeText(GameScreen_bugfix.this, "music loaded!", Toast.LENGTH_SHORT).show(); 
    } 
} 

Si la música no ha cargado Me estoy haciendo una Excepción nullpointer, mirando los documentos veo que hay un getStatus() pero he intentado algo como esto:

music_load_status=LoadMusicInBackground.getStatus() 

y eso no funciona :( ¿Cómo puedo verificar si la tarea de fondo está completa y la música cargada?

Gracias!
Ryan

Respuesta

156

getStatus() comprueba si el la AsyncTask está pendiente, en ejecución, o terminado.

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 
} 

Si desea comprobar si su acción realmente tuvo éxito (es decir, la música estaba cargado con éxito), entonces usted necesita para llegar a su propio método que determina que. El getStatus() solo puede determinar el estado del hilo real en AsyncTask.

+0

Gracias! Lo verificará! – Ryan

+11

Para aclarar: FINISHED es el estado DESPUÉS de llamar a PostExecute. Si comprueba el estado en onPostExecute, el estado será RUNNING – user123321

+0

, entonces, ¿por qué devuelve RUNNING en postexcute, es sorprendente – Sameer

17

Esto es una programación asincrónica: no debe verificar desde el hilo de la interfaz de usuario, ya que esto significa que está bloqueando el hilo de la interfaz de usuario (presumiblemente ejecutando un ciclo de verificación con Thread.sleep()?).

En su lugar, se le debe llamar cuando se realiza AsyncTask: desde onPostExecute() llame al método que necesite en la actividad.

Advertencia: la desventaja de este enfoque es que la actividad debe estar activa cuando termina el hilo de fondo. A menudo, este no es el caso, por ejemplo, si se retrocede o se cambia la orientación. Mejor enfoque es enviar una transmisión desde onPostExecute() y luego las actividades interesadas pueden registrarse para recibirla. La mejor parte es que Activity solo recibe broadcast si está activo en ese momento, lo que significa que se pueden registrar múltiples actividades, pero solo el activo lo recibirá.

2

Crear AsyncTask con oyente

class ClearSpTask extends AsyncTask<Void, Void, Void> { 

    public interface AsynResponse { 
     void processFinish(Boolean output); 
    } 

    AsynResponse asynResponse = null; 

    public ClearSpTask(AsynResponse asynResponse) { 
     this.asynResponse = asynResponse; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showProgressDialog(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     cleardata(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     hideProgressDialog(); 
     asynResponse.processFinish(true); 
    } 
} 

y utilizar los AsyncTask

new ClearSpTask(new ClearSpTask.AsynResponse() { 
     @Override 
     public void processFinish(Boolean output) { 
      // you can go here 
     } 
}).execute(); 

espero que esto podría ayudar a algunas personas

Cuestiones relacionadas