2013-03-20 2 views
10

Как вызвать метод записи через 5 миллисекунд, воспроизводя аудио с помощью MediaPlayer. Я пробовал что-то подобное, но я не знаю, и я не нашел хороших примеров, чтобы положить конец этому.Вызов метода после 5 миллисекунд

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; 
+0

'Thread.sleep (5) Будет;' решить Эта проблема? – ppeterka

+2

u необходимо использовать расписание таймера для этого. - http://developer.android.com/reference/java/util/Timer.html –

+1

вы можете увидеть здесь http://stackoverflow.com/questions/3072173/how-to -call-a-method-after-a-delay? rq = 1 –

ответ

44

5 миллисекунд - очень короткий промежуток времени, и вы не можете ограничить аудио выход до такой продолжительности. вы можете использовать Handler для выполнения функции с задержкой, но она не гарантирует выполнение в 5 миллисекунд после планирования. код для выполнения, что:

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

Возможно, вы хотите использовать Thread.sleep?

Как так:

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

Обратите внимание, что я использовал == в if заявлении для проверки равенства, а не присваивает значение 0 каждый раз, я полагаю, это то, что вы хотите.

Стоит упомянуть, что установка Thread для сна остановит его на все, что вы укажете. Если это поток пользовательского интерфейса, вы фактически «заморозите» пользовательский интерфейс для этой продолжительности, поэтому убедитесь, что используете его соответствующим образом. Hwoever, вы пример for loop указывает, что это именно то, что вы пытаетесь сделать.

+2

Просто будьте осторожны, что это прекрасно на порожденной нити, но это плохая идея, если вы позвоните это из потока пользовательского интерфейса. – Jeshurun

0

Вы можете попробовать использовать Thread.sleep (5) или, если вы не хотите использовать поток пользовательского интерфейса для этого, вы можете использовать таймер или AsyncTask, который запускает обратный вызов после ожидания 5 мс в doInBackground().

Вот очень хороший пример использования таймера: https://stackoverflow.com/a/4598737/832008

7

Вы можете использовать метод postDelayed. В приведенном ниже примере я запускаю свою рутину 100 миллисов после вызова метода.

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

Вы также можете использовать ScheduledExecutorService

Использование ExecutorService, вы можете запланировать команды для запуска после заданной задержки или периодически выполнять. Следующий пример показывает класс с методом, который устанавливает ScheduledExecutorService подавать звуковой сигнал каждые десять секунд в течение часа:

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); 
    } 
} 
1

попробовать следующее:

//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); 
     } 
Смежные вопросы