studio programacion herramientas fundamentos con avanzado aplicaciones android

programacion - manual de android en pdf



Android, AsyncTask, ¿verifica el estado? (3)

Este es mi código:

En onCreate:

new LoadMusicInBackground().execute();

Luego, hacia el final de mi clase principal, 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 se ha cargado, recibo una excepción de nullpointer, al mirar 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


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 usa Asynctask

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

Espero que esto pueda ayudar a algunas personas


Esta 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 (probablemente ejecutando un ciclo de verificación con Thread.sleep ()?).

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

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á.


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

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 verificar si su acción realmente tuvo éxito (es decir, si la música se cargó con éxito), entonces debe idear su propio método que lo determine. El getStatus() solo puede determinar el estado del hilo real en AsyncTask .