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
.