2012-06-21 2 views
2

두 개의 스레드 (내 스레드 및 루퍼를 통해 메시지를 보내는 MediaPlayer 스레드)를 가정합니다. 내 게임 스레드가 사용자 입력에 반응합니다 : 사용자가 게임 플레이를 일시 중지하면 MediaPlayer.pause()도 호출합니다.Android MediaPlayer 비헤이비어 (이벤트 순서 보장)

이벤트의 다음과 같은 순서로 고려 :

  1. MediaPlayer를 오디오 스트림의 끝에 도달을, 그래서 나에게
  2. 내 스레드 OnCompletion 메시지를 큐에 넣습니다 : MediaPlayer.pause() 사용자 작업으로 인해이라고를
  3. 나는이 내가 함께 (이미(), 너무 늦게 위라는 일시 정지 된)

문제를 OnCompletion 전화를받을 MediaPlayer.pause()는 PAUSED 및 STARTED 상태에서만 허용되지만 1 단계로 인해 Media Player는 pause()가 호출 될 때이 이미 PlaybackCompleted 상태가됩니다. 나는 이 솔루션을 참조하십시오 MediaPlayer.isPlaying()을 요구

  • 일시 정지()를 호출하기 전에 예외를 잡기

    그러나 두 번째 솔루션은 다음과 같은 경우에 문제가 있습니다

    1. 게임이 시작되었지만 MediaPlayer.start()가 호출되었지만 미디어 플레이어 상태가 이 아닌 경우 STARTED
    2. 사용자가 코드를 호출하여 게임을 종료합니다. if (isPlaying()) pause();
    3. MediaPlayer를 상태를 시작 들어가는 MediaPlayer가되는 것이므로 것,

    여기서 문제가합니다 ( 문서가 너무 말한대로) isPlaying()가 여전히 false를 반환하는 것입니다 (지금, 를 true를 반환하지만 너무 늦은 것 isPlaying) 여전히 3 단계로 시작하십시오.

    두 가지 경우 모두에서 올바른 해결책을 피할 수 있습니까? (또는 생각의 내 위의 기차가 어떤 실수는?)


    업데이트

    (나는 안드로이드 문서에서 인용 것이기 때문에 내가 여기에 그것을 할) Geobits '대답에 반응 :

    예, 로컬 재생도하고 있습니다. 테스트 해 보았지만 모든 것이 잘 돌아갔습니다. 그러나이 문서는 다소 모순적입니다. 첫 번째 부분 (이 OK 인)

    불러야()는 일시 정지 MediaPlayer를 개체 의 재생을 재개하고, 다시 재생 위치가 일시 정지 된 위치와 동일하다. start()에 대한 호출이 반환되면 일시 중지 된 MediaPlayer 객체는 의 시작 상태으로 돌아갑니다.

    그리고 같은 페이지에서 다른 인용 :

    재생이 일시 정지 및 정지, 현재 재생 위치 조정할 수 있습니다 할 수 있습니다. 재생은 일시 중지()를 통해 일시 중지 할 수 있습니다. pause() 호출이 반환되면 MediaPlayer 객체는 일시 중지됨 상태가됩니다. 은 시작 상태에서 일시 중지 상태 및 (역순으로)으로의 전환이 플레이어 엔진에서 비동기 적으로 발생 함을 나타냅니다. isPlaying()에 대한 호출에서 상태가 업데이트되기 전에 약간의 시간이 일 수 있으며, 은 스트리밍 된 콘텐츠의 경우 초 수일 수 있습니다.

    이 후자는 일시 중지 선수를 시작할 때 또한, 상태 변화 ("반대")를 시간이 걸릴 수 있다고 말한다. 지금까지는 내부 플레이어 엔진에만 적용 되었기 때문에 매우 좋았지 만 다음은 미친 부분입니다. "isPlaying()에 대한 호출에서 상태가 업데이트되기까지 어느 정도 시간이 걸릴 수 있습니다". 이것은 isPlaying() 이 OBSERVABLE 상태을 리턴하지 않고 내부 상태에 의존 함을 의미합니다. 이것은 혼란 스럽다.

  • 답변

    2

    나는 MediaPlayer로 몇 가지 응용 프로그램을 수행하고 매번 if(isPlaying()) pause();을 사용하여 나쁜 영향을 미치지 않습니다. 그것은 지역 언론과 함께합니다. 스트리밍하는 경우 대기 시간이 실제로 두 번째 유형의 문제를 일으킬 수 있습니다.

    당신이 그것을 깰 수 있는지보십시오. 할 수 없다면 걱정할 필요가 없습니다. 가능한 경우 언제든지 해결할 수 있습니다. 부울을 설정하면 start()을 호출하여 일시 정지를 대기 상태로 만들지 만 다른 방법이 있다고 생각하지는 않습니다.

    하지만 먼저 시도해보십시오. 그것은 저를 위해 잘 행동하고, 나는 내 쓰레기를 플레이 테스트했습니다.

    +0

    확인해 주셔서 감사합니다. 며칠 전 확신하기 위해 해결 방법을 구현했습니다. 그럼에도 불구하고 내 결과는 귀하의 것과 동일하지만 문서가 특정 부분에서 실제로 혼란 스럽습니다. 인용구에 대한 원래 질문 게시글을 참조하십시오 (마지막 업데이트). –

    +1

    그래, 얼마나 많은 예쁜 다이어그램과 차트가 추가 되더라도 그 클래스의 문서는 끔찍하게 혼란 스럽다. 나는 모든 상황에서 제대로 작동하기 위해 wakelock을 얻으려고 거의 내 머리카락을 찢어 버렸다. – Geobits

    +0

    또 다른 모순되는 점은 PlaybackCompleted 상태에서 pause()를 호출 할 수 있는지 여부입니다. 문서에 따르면 오류 상태로 전환 할 수는 없지만 실제로는 그렇게 할 수 있습니다. 그리고 재생이 완료되었는지 (실제로는 onCompletion 콜백 만 가능) 동기화 여부를 실제로 확인할 수 없다는 것을 고려하면 pause() 호출이 안전한지 알 수 없습니다 (트릭없이). 질문을 보내지 만 지금까지 답변이 없습니다. http://groups.google.com/group/android-platform/browse_thread/thread/5ed3ed460880c0fc# –