38 votes

Android, AsyncTask, vérifier le statut?

Ceci est mon code:

Dans onCreate:

  new LoadMusicInBackground().execute();
 

Puis vers la fin de ma classe principale j'ai ce code

 /** 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 musique n'a pas été chargée, une exception nullpointer est générée. En examinant les docs, je constate qu'il existe un getStatus (), mais j'ai essayé quelque chose comme ceci:

 music_load_status=LoadMusicInBackground.getStatus()
 

et cela ne fonctionne pas :( Comment puis-je vérifier si la tâche en arrière-plan est terminée et que la musique est chargée?

Merci!
Ryan

166voto

DeeV Points 16141

getStatus() vérifie si le AsyncTask est en attente, en cours d'exécution ou terminé.

 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 vous voulez vérifier si votre action a réellement réussi (c'est-à-dire que la musique a été chargée avec succès), vous devez alors définir votre propre méthode qui le détermine. Les getStatus() ne peuvent déterminer que l'état du thread actuel en AsyncTask .

17voto

Peter Knego Points 57985

C'est asynchrone de programmation: - vous ne devez pas vérifier à partir de l'UI thread, parce que cela signifie que vous ne bloque le thread d'INTERFACE utilisateur ( probablement exécution d'une vérification en boucle avec le Fil.sleep()?).

Au lieu de cela, vous devriez être appelé lorsque l'AsyncTask est fait: il est onPostExecute() appel quelle que soit la méthode de l'Activité dont vous avez besoin.

Mise en garde: l'inconvénient de cette approche est que l'Activité doit être active lorsque le thread d'arrière-plan de finitions. Ce n'est pas souvent le cas, par exemple si le dos est prwssed ou d'orientation est modifiée. Une meilleure approche consiste à envoyer une diffusion à partir d' onPostExecute() et ensuite intéressés activités peuvent s'inscrire pour la recevoir. La meilleure partie est que l'Activité ne reçoit que la diffusion s'il est actif à cette époque, ce qui signifie que plusieurs Activités peuvent s'inscrire, mais seulement l'actif recevoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X