2013-05-13 4 views
0

주차를 돕기 위해 자동차에서 찾을 수있는 일종의 레이더를 구현하고 싶습니다. 바인더가 내 활동에 올바르게 연결된 서비스에서 짧은 사운드를 반복해야하는 스레드를 시작합니다. 짧은 기간 동안 wav (길이 110ms)가 변경됩니다. 이 코드를 사용하면 처음에는 첫 번째 루프가 사운드를 재생하지만 어려움을 겪고 빠르게 리듬을 잃게됩니다. 최악의 경우 서비스가 중단되지 않습니다. 가비지 컬렉터가 포화 상태입니다. 제대로 실현할 수있는 방법을 찾지 못했습니다. 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입니다.