【问题标题】:Call method after 5 millisecond5毫秒后调用方法
【发布时间】:2013-03-20 11:00:10
【问题描述】:

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

【问题讨论】:

标签: android delay record playing


【解决方案1】:

5 毫秒是一个非常短的时间段,您不能将音频输出限制在这样的时间段内。 您可以使用Handler 执行延迟函数,但它不能确保在调度后 5 毫秒执行。 这样做的代码:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

        【解决方案4】:

        也许你想使用Thread.sleep

        像这样:

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

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

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

        【讨论】:

        • 请注意,这在衍生线程上很好,但如果您从 UI 线程调用它是个坏主意。
        【解决方案5】:

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

        这是一个很好的使用定时器的例子: https://stackoverflow.com/a/4598737/832008

        【讨论】:

          【解决方案6】:

          你也可以使用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);
             }
           }
          

          【讨论】:

            【解决方案7】:
            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 );
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-07
              • 2020-10-20
              相关资源
              最近更新 更多