2013-03-20 32 views
10

Cách gọi phương thức ghi sau 5 mili giây phát âm thanh bằng MediaPlayer. Tôi đã thử một cái gì đó như thế nhưng tôi không biết và tôi đã không tìm thấy bất kỳ ví dụ tốt để kết thúc này.Phương thức gọi sau 5 mili giây

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

Sẽ 'Thread.sleep (5); 'giải quyết vấn đề này? – ppeterka

+2

u cần sử dụng lịch hẹn giờ cho this.- http://developer.android.com/reference/java/util/Timer.html –

+1

bạn có thể xem tại đây http://stackoverflow.com/questions/3072173/how-to -call-a-method-after-a-delay? rq = 1 –

Trả lời

44

5 mili giây là khoảng thời gian rất ngắn và bạn không thể giới hạn đầu ra âm thanh trong thời gian đó. bạn có thể sử dụng Handler để thực hiện một chức năng bị trì hoãn nhưng nó sẽ không đảm bảo thực hiện tại 5 mili giây sau khi lên lịch. mã để làm điều đó:

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

Có lẽ bạn muốn sử dụng Thread.sleep?

Giống như vậy:

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

Chú ý rằng tôi sử dụng == trong báo cáo if để kiểm tra sự bình đẳng, chứ không phải là gán giá trị của 0 mỗi lần, tôi cho rằng đây là những gì bạn muốn.

Điều đáng nói là việc đặt một Chủ đề vào chế độ ngủ sẽ ngăn nó hoạt động trong khoảng thời gian bạn chỉ định. Nếu đây là Giao diện người dùng, thì bạn sẽ "đóng băng" giao diện người dùng hiệu quả trong khoảng thời gian đó, vì vậy hãy đảm bảo bạn đang sử dụng nó một cách thích hợp. Hwoever, bạn ví dụ for vòng lặp cho biết đây chính là loại điều bạn đang cố gắng làm.

+2

Chỉ cần cảnh giác rằng điều này là tốt trên một sợi tơ sinh ra, nhưng là một ý tưởng tồi nếu bạn gọi từ chuỗi giao diện người dùng. – Jeshurun

0

Bạn có thể thử sử dụng Thread.sleep (5), hoặc nếu bạn không muốn sử dụng chuỗi giao diện người dùng cho điều này, bạn có thể sử dụng Bộ hẹn giờ hoặc AsyncTask kích hoạt gọi lại sau khi đợi 5ms trong doInBackground() phương pháp.

Dưới đây là một ví dụ khá tốt cho việc sử dụng Timer: https://stackoverflow.com/a/4598737/832008

7

Bạn có thể sử dụng phương pháp postDelayed. Trong ví dụ dưới đây, tôi chạy thường lệ 100 triệu sau khi gọi phương thức.

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

Bạn cũng có thể sử dụng ScheduledExecutorService

Sử dụng một ExecutorService, bạn có thể lên lịch để chạy lệnh sau một thời gian nhất định, hoặc để thực hiện theo định kỳ. Ví dụ sau đây cho thấy một lớp học với một phương pháp mà thiết lập một ScheduledExecutorService để phát ra tiếng bíp mỗi mười giây cho một giờ:

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

thử này:

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