web-dev-qa-db-ja.com

5ミリ秒後にメソッドを呼び出す

MediaPlayerでオーディオを5ミリ秒再生した後、recordメソッドを呼び出す方法。私はそのようなことを試しましたが、私にはわかりません、そしてこれを終わらせるための良い例は見つかりませんでした。

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;   
14
nedroid

5ミリ秒は非常に短い期間であり、オーディオ出力をそのような期間に制限することはできません。 Handlerを使用して遅延関数を実行することはできますが、スケジューリング後5ミリ秒での実行は保証されません。それを行うためのコード:

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

メソッドpostDelayedを使用できます。以下の例では、メソッドを呼び出す100ミリ秒後にルーチンを実行しています。

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

これを試して:

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

たぶん Thread.sleep

そのようです:

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

毎回==の値を割り当てるのではなく、ifステートメントで0を使用して同等性をチェックしていることに注意してください。

スレッドをスリープ状態にすると、指定した期間中は何も実行されなくなります。これがUIスレッドの場合、その期間UIを効果的に「凍結」するため、適切に使用していることを確認してください。ただし、forループの例は、これがまさに、実行しようとしていることを示しています。

1
musefan

Thread.sleep(5)を使用するか、UIスレッドを使用しない場合は、タイマー、またはdoInBackground()メソッドで5ミリ秒待機した後にコールバックをトリガーするAsyncTaskを使用できます。

タイマーを使用するためのかなり良い例を次に示します。 https://stackoverflow.com/a/4598737/832008

0
Analizer

ScheduledExecutorService を使用することもできます

ExecutorServiceを使用すると、コマンドをスケジュールして、特定の遅延後に実行するか、定期的に実行することができます。次の例は、ScheduledExecutorServiceを10秒ごとに1時間ビープするように設定するメソッドを持つクラスを示しています。

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

これで、ハンドラーを呼び出して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 );
0
Mahabub Karim