2012-06-21 38 views
2

假設兩個線程:我的線程和MediaPlayer線程(它通過循環發送 消息給我)。我的遊戲線程會對用戶輸入做出反應:如果用戶暫停遊戲玩法,我也會調用MediaPlayer.pause()以及 。Android MediaPlayer行爲(事件順序保證)

考慮事件的順序如下:

  1. MediaPlayer在音頻流到達終點,所以它的入列 OnCompletion留言給我
  2. 我的主題:MediaPlayer.pause()稱爲由於用戶操作
  3. 我收到OnCompletion調用(爲時已晚,暫停()已經 以上的稱呼)

的問題,這個我只有在 PAUSED和STARTED狀態下才允許MediaPlayer.pause(),但由於步驟1,當調用pause()時,MediaPlayer將 已處於PlaybackCompleted狀態。我看到 兩種解決方案:

  • 問MediaPlayer.isPlaying()調用暫停()之前

    1. 捕獲異常

    但第二個解決方案具有以下情形的一個問題:

    1. 遊戲開始,MediaPlayer.start()調用,但mediaplayer狀態爲 尚未 STARTED
    2. 用戶離開遊戲,調用代碼:if(isPlaying())pause();
    3. 的MediaPlayer進入啓動的狀態(現在IsPlaying模塊將返回true, 但爲時已晚)

    這裏的問題是,IsPlaying模塊()仍然會返回false(如 文檔說太多),所以在MediaPlayer會仍然由於第3步啓動。

    有沒有解決方案是正確的,並避免在兩種情況下的例外? (或者是我思想的上述列車有什麼錯誤嗎?)


    更新

    反應到Geobits'的答案(我這樣做,是因爲我會從Android電子文檔引用):

    是的,我也在做本地播放,就像你一樣對它進行了很多測試,並且一切都很好。但文件有點自相矛盾。第一部分(這是確定):

    調用start()恢復回放暫停的MediaPlayer對象, 和恢復播放位置相同,它被暫停。 當對start()的調用返回時,已暫停的MediaPlayer對象變爲 回到Started狀態

    而且在同一頁面另一句名言:

    回放可以暫停和停止,以及當前播放位置 可以調整。播放可以通過暫停()暫停。當 pause()調用返回時,MediaPlayer對象進入暫停狀態。注意 ,從開始狀態到暫停狀態的轉換和 反之亦然在播放器引擎中異步發生。 在調用isPlaying()的狀態更新前一段時間可能需要 ,而在流傳輸內容的情況下,它可能是秒數。

    這後一說,也當開始已暫停的播放器中,狀態改變可能需要一段時間(「反之亦然」)。到目前爲止這麼好,因爲它只適用於內部播放器引擎,但隨後出現了瘋狂的部分:「在調用isPlaying()」的狀態更新之前可能需要一段時間。這意味着isPlaying()不返回OBSERVABLE狀態,而是取決於內部狀態。這很混亂。

  • 回答

    2

    我已經使用MediaPlayer完成了幾個應用程序,並且每次都使用if(isPlaying()) pause();而沒有任何不良影響。不過,這與當地媒體有關。如果您正在流式傳輸,延遲可能會導致第二種類型的問題。

    試一下,看看你是否可以打破它。如果你不能,那沒什麼可擔心的。如果可以的話,你可以隨時解決它。當你撥打start(),排隊暫停時,設置一個布爾值,我相信還有其他方法我沒有想到。

    但是先試一試。它對我來說表現很好,而且我玩了我的廢話。

    +0

    感謝您的確認。幾天前,爲了確保,我實施了一種解決方法(實際上是一種萬無一失)的解決方案,是的。儘管如此,我的結果與您的結果相同,但文檔在某個部分非常混亂:請參閱我的原始問題帖子(我在最後更新了它)。 –

    +1

    是的,無論它添加了多少個漂亮的圖表和圖表,該類文檔都非常令人困惑。我幾乎把我的該死的頭髮撕掉,試圖讓wakelock在所有情況下正常工作。 – Geobits

    +0

    另一個矛盾的是你是否可以在PlaybackCompleted狀態下調用暫停()。根據文檔,你不能(它轉移到錯誤狀態),但在實踐中,你可以。考慮到你不能同步檢查播放是否完成(你只有onCompletion回調),你不知道(沒有技巧)你的pause()調用是否安全。我向他們發送了一個問題,但目前還沒有答案: http://groups.google.com/group/android-platform/browse_thread/thread/5ed3ed460880c0fc# –