5毫秒后调用方法

时间:2013-03-20 11:00:10

标签: android delay record playing

如何在使用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;   

7 个答案:

答案 0 :(得分:46)

5毫秒是一个非常短的时间段,您无法将音频输出限制为此类持续时间。 您可以使用Handler执行延迟功能,但不能确保在调度后5毫秒执行。 这样做的代码:

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

答案 1 :(得分:7)

您可以使用postDelayed方法。 在下面的例子中,我运行我的例程100毫秒后调用方法。

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

答案 2 :(得分:2)

试试这个:

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

答案 3 :(得分:1)

也许您想使用Thread.sleep

像这样:

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

请注意,我在==语句中使用if来检查是否相等,而不是每次都指定0的值,我认为这是你想要的。

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

答案 4 :(得分:0)

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

以下是使用Timer的一个很好的例子: https://stackoverflow.com/a/4598737/832008

答案 5 :(得分: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);
   }
 }

答案 6 :(得分:0)

public static MediaRecorder mRecorder = new MediaRecorder();

public void startRecording(String fileName) {
    if(mRecorder != null) {
        try {
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setOutputFile(fileName);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            try {
                mRecorder.prepare();
            } catch (IOException e) {
                Log.e(StartPhoneCallService.class.getSimpleName(), "prepare() failed");
            }
            mRecorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}

public void stopRecording() {
    if(mRecorder != null) {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }
}

现在您可以调用Handler播放5毫秒

private final int recording_time = 5;

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
  @Override
  public void run() {
     startRecording("YOUR FILE NAME");
     // Stop your recording after 5 milliseconds
     stopRecording();
   }
}, recording_time );