2013-05-13 3 views
0

Я хочу реализовать своего рода радар, который мы можем найти на автомобилях, чтобы помочь парковка. На службе, которая правильно связана с моей деятельностью связующим, я запускаю поток, который должен повторить короткий sound.wav (110 мс) с коротким периодом, который изменится. С помощью этого кода вначале первый цикл воспроизводит звук, но имеет трудности и быстро теряет ритм. Хуже того, сервис никогда не остановится. Сборщик мусора насыщен. Я не нашел способ правильно понять это. THXandroid: играть короткий звук с коротким периодом эволюции с использованием SoundPool

 public class MainService extends Service implements OnLoadCompleteListener{ 
      private boolean soundradarloaded; 
      private SoundPool spoolradar; 
      private int soundradarID; 
      private Thread timerThread; 
      private boolean timerThreadrunning; 

      public int onStartCommand(Intent intent, int flags, int startId) { 
       soundradarloaded=false; 
       spoolradar = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
       soundradarID = spoolradar.load(this, R.raw.beepradar1, 1); 
       spoolradar.setOnLoadCompleteListener(this); 
       timerThreadrunning=true; 
       timerThread=new Thread(new Runnable() { 
       @Override 
       public void run() { 


        int counter=0; 
        long offset=System.currentTimeMillis(); 
        while(timerThreadrunning) { 
         // Traitement 
         longtime=System.currentTimeMillis()-offset; 
         if(soundradarloaded && longtime%400==0){//play every 400ms 
          spoolradar.play(soundradarID, 1, 1, 1, 0, 1f); 
         } 
         try { 
          Thread.sleep(1); 
         } catch (InterruptedException ex) { 
         } 
        } 

        } 
      }); 

      timerThread.start(); 
     } 

    @Override 
    public void onLoadComplete(SoundPool arg0, int arg1, int arg2) { 

       if(arg0==spoolradar) 
        soundradarloaded=true; 

    } 
    @Override 
    public void onStop() { 
     timerThreadrunning=false; 
     try{ 
       Thread.sleep(1); 
      }catch (InterruptedException ex) { 
         } 
     spoolradar.release(soundradarID); 
     } 

} 

ответ

0

Точность Thread.sleep() не гарантируется. Если Thread.sleep (1) игнорируется, то линия

if(soundradarloaded && longtime%400==0){//play every 400ms

может выполняться несколько раз в течение одной и той же миллисекунды и несколько звуковых потоков воспроизводятся почти в то же время (или в нежелательное время позже). Вторая проблема заключается в том, что timerThread работает и постоянно использует CPU (и аккумулятор).

Посмотрите на https://developer.android.com/reference/java/util/Timer.html или, может быть, https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html, чтобы выбрать лучшее решение.

Смежные вопросы