web-dev-qa-db-fra.com

Méthode d'appel après 5 millisecondes

Comment appeler la méthode d'enregistrement après 5 millisecondes de lecture audio avec MediaPlayer. J'ai essayé quelque chose comme ça mais je ne le sais pas et je n'ai trouvé aucun bon exemple pour y mettre fin.

while(mp.isPlaying()){
    if(record=0){
       for(int i=0; i<5millisec; i++){ //how to define 5 millisec or is any better solution
       }
    startRecord();
    record=1;
    }
}
mp.stop();
mp.release();
mp=null;   
12
nedroid

5 millisecondes est une période très courte et vous ne pouvez pas limiter la sortie audio à une telle durée . Vous pouvez utiliser Handler pour exécuter une fonction retardée mais cela ne garantira pas l'exécution à 5 millisecondes après la planification .. faire ça:

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
      public void run(){
        startRecord();
        mp.stop();
        mp.release();
   }
}, 5);
46
Mr.Me

Vous pouvez utiliser la méthode postDelayed. Dans l'exemple ci-dessous, j'exécute ma routine 100 millions après pour appeler la méthode.

new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        barVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
                    }
                }, 
                100);
7
lpmfilho

essaye ça:

//Auto Start after 2 seconds
        if(ENABLE_AUTO_START) {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    // this code will be executed after 2 seconds
                    doThis();
                }
            }, 2000);
        }
1
MrG

Peut-être que vous voulez utiliser Thread.sleep ?

Ainsi:

if(record == 0){
   Thread.sleep(5);
}

Notez que j’ai utilisé == dans l’instruction if pour vérifier l’égalité, plutôt que d’attribuer la valeur de 0 à chaque fois, je suppose que c’est ce que vous voulez.

Il est à noter que la mise en veille d'un thread l'empêchera de faire quoi que ce soit pendant la durée spécifiée. S'il s'agit d'un thread d'interface utilisateur, vous "gèlerez" efficacement l'interface utilisateur pour cette durée. Assurez-vous de l'utiliser correctement. Cependant, votre exemple de boucle for indique que c’est exactement le genre de chose que vous essayez de faire.

1
musefan

Vous pouvez essayer d'utiliser Thread.sleep (5) ou, si vous ne souhaitez pas utiliser le fil d'interface utilisateur pour cela, vous pouvez utiliser un minuteur ou une AsyncTask qui déclenche un rappel après avoir attendu 5 ms dans la méthode doInBackground ().

Voici un très bon exemple d'utilisation de Timer: https://stackoverflow.com/a/4598737/832008

0
Analizer

Vous pouvez également utiliser ScheduledExecutorService

À l'aide d'un ExecutorService, vous pouvez planifier l'exécution de commandes après un délai donné ou une exécution périodique. L'exemple suivant montre une classe avec une méthode qui configure un ScheduledExecutorService pour qu'il émette un bip toutes les dix secondes pendant une heure:

import static Java.util.concurrent.TimeUnit.*;
 class BeeperControl {
   private final ScheduledExecutorService scheduler =
     Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle =
       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }
0
Trinity