2013-03-20 45 views
10

如何在MediaPlayer播放音频5毫秒后调用记录方法。我尝试了类似的东西,但我不知道,我没有找到任何好的例子来结束这件事。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 2013-03-20 11:02:38

+2

你需要使用这个计时器的时间表.- http://developer.android.com/reference/java/util/Timer.html – 2013-03-20 11:03:38

+1

你可以在这里看到http://stackoverflow.com/questions/3072173/how-to -all-a-method-after-a-delay?rq = 1 – 2013-03-20 11:03:52

回答

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语句中使用==检查的平等,而不是分配的,每次0

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

通知,我想这是你想要的。

值得一提的是,将线程置于睡眠状态将会阻止它在您指定的时间内执行任何操作。如果这是一个UI线程,那么您将有效地“冻结”该持续时间的用户界面,因此请确保您正确使用它。但是,例如for循环表明这正是您尝试执行的操作。

+2

只需要警惕,在产生的线程上这种罚款,但是如果你致电它来自UI线程。 – Jeshurun 2013-09-25 07:38:11

0

您可以尝试使用Thread.sleep(5),或者,如果您不想使用UI线程进行此操作,可以使用Timer或AsyncTask在doInBackground中等待5ms后触发回调() 方法。

下面是使用定时器一个很好的例子: 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); 
     }