2012-09-05 2 views
0

나는 오디오 파일을 재생하는 응용 프로그램을 작성 중이므로 최소화하면서 계속 진행하고 싶습니다. 나는이 일을했지만, 오디오 재생을 별도의 스레드로하고 싶다. 안드로이드 개발자 웹 사이트에 따르면, CPU가 많은 서비스는 별도의 스레드에서 더 잘 작동하기 때문이다.안드로이드 - 별도의 스레드에서 수동으로 멈춤 가능한 서비스

먼저 IntentService를 사용해 보았습니다 (이것이 완벽한 해결책이었습니다). 그러나 바보 같은 이유로 코드가 실행되면 서비스 자체가 파기됩니다. 바로 뒤에 이 시작되어 파일을 재생합니다. 나는 이것을 막을 수 없었다.

그럼 서비스를 실행하는 스레드를 만들었습니다. 내가 서비스를 시작 true로 startService를 설정 그 후, 분명히

serviceThread = new Thread() { 
     public void run() { 
      while (true) { 
       if (playAudio) { 
        startService(new Intent(getApplicationContext(), 
          MusicService.class)); 
        playAudio = false; 
       } 
       if (stopAudio) { 
        stopService(new Intent(getApplicationContext(), 
          MusicService.class)); 
        stopAudio = false; 
       } 
      } 
     } 
    }; 

내가 설정 : 내가 할 수있는 가장 좋은 일이있다 - 그러나, 나는 필요할 때 스레드가 서비스를 중지하는 방법을 모른다 stopService를 true로 설정하여 중지하십시오. 그러나 스레드는 항상 검사를 계속해야하므로 모든 쓸모없는 작업을 수행해야합니다. 나는 왜 앱이 작동하는지 잘 모르겠다. 매초마다 수표를 찍는 것과 같지 않은가?

어떻게 제대로 할 수 있습니까?

답변

0

서비스가 실행되는 스레드를 차단할 수 없다고 가정하면 루프 작업이 끝날 때마다 너무 많은 작업을 수행 할 것을 염려 할 경우 java.lang.Thread.Sleep을 추가 할 수 있습니다.

응용 프로그램이 여전히 작동하는 이유를 이해하기 위해 스레드 스케줄링 및 시간 슬라이스를 읽을 수도 있습니다 (그러나 필요한 것보다 훨씬 많은 CPU 사용).

+0

감사합니다. 덕분에 많은 도움이되었습니다. 그러나 응용 프로그램에 다시 들어가면 올바르게 작동하지 않습니다. 스레드가 서비스에 있어야합니다. Service 클래스를 ServiceIntent (자체 스레드를 실행하는 서비스 클래스)로 다시 작성하고 onHandleIntent 메서드에서 해당 코드를 사용했습니다. 즉, 100ms 동안 잠자기 한 다음 main 메서드에서 부울을 가져옵니다. 오디오를 중지하려면 부울을 false로 설정하십시오. –

관련 문제