MediaPlayer的狀態轉換圖也表徵了它的生命周期,如下: 這張狀態轉換圖清晰的描述了MediaPlayer的各個狀態,也列舉了主要的方法的調用時序,每種方法只能在一些特定的狀態下使用,如果使用時MediaPlayer的狀態不正確則會引發IllegalStateException異常。 Idle ...
MediaPlayer的狀態轉換圖也表徵了它的生命周期,如下:
這張狀態轉換圖清晰的描述了MediaPlayer的各個狀態,也列舉了主要的方法的調用時序,每種方法只能在一些特定的狀態下使用,如果使用時MediaPlayer的狀態不正確則會引發IllegalStateException異常。
Idle 狀態:當使用new()方法創建一個MediaPlayer對象或者調用了其reset()方法時,該MediaPlayer對象處於idle狀態。這兩種方法的一個重要差別就是:如果在這個狀態下調用了getDuration()等方法(相當於調用時機不正確),通過reset()方法進入idle狀態的話會觸發OnErrorListener.onError(),並且MediaPlayer會進入Error狀態;如果是新創建的MediaPlayer對象,則並不會觸發onError(),也不會進入Error狀態。
End 狀態:通過release()方法可以進入End狀態,只要MediaPlayer對象不再被使用,就應當儘快將其通過release()方法釋放掉,以釋放相關的軟硬體組件資源,這其中有些資源是只有一份的(相當於臨界資源)。如果MediaPlayer對象進入了End狀態,則不會在進入任何其他狀態了。
Initialized 狀態:這個狀態比較簡單,MediaPlayer調用setDataSource()方法就進入Initialized狀態,表示此時要播放的文件已經設置好了。
Prepared 狀態:初始化完成之後還需要通過調用prepare()或prepareAsync()方法,這兩個方法一個是同步的一個是非同步的,只有進入Prepared狀態,才表明MediaPlayer到目前為止都沒有錯誤,可以進行文件播放。
Preparing 狀態:這個狀態比較好理解,主要是和prepareAsync()配合,如果非同步準備完成,會觸發OnPreparedListener.onPrepared(),進而進入Prepared狀態。
Started 狀態:顯然,MediaPlayer一旦準備好,就可以調用start()方法,這樣MediaPlayer就處於Started狀態,這表明MediaPlayer正在播放文件過程中。可以使用isPlaying()測試MediaPlayer是否處於了Started狀態。如果播放完畢,而又設置了迴圈播放,則MediaPlayer仍然會處於Started狀態,類似的,如果在該狀態下MediaPlayer調用了seekTo()或者start()方法均可以讓MediaPlayer停留在Started狀態。
Paused 狀態:Started狀態下MediaPlayer調用pause()方法可以暫停MediaPlayer,從而進入Paused狀態,MediaPlayer暫停後再次調用start()則可以繼續MediaPlayer的播放,轉到Started狀態,暫停狀態時可以調用seekTo()方法,這是不會改變狀態的。
Stop 狀態:Started或者Paused狀態下均可調用stop()停止MediaPlayer,而處於Stop狀態的MediaPlayer要想重新播放,需要通過prepareAsync()和prepare()回到先前的Prepared狀態重新開始才可以。
PlaybackCompleted狀態:文件正常播放完畢,而又沒有設置迴圈播放的話就進入該狀態,並會觸發OnCompletionListener的onCompletion()方法。此時可以調用start()方法重新從頭播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()來重新定位播放位置。
Error狀態:如果由於某種原因MediaPlayer出現了錯誤,會觸發OnErrorListener.onError()事件,此時MediaPlayer即進入Error狀態,及時捕捉並妥善處理這些錯誤是很重要的,可以幫助我們及時釋放相關的軟硬體資源,也可以改善用戶體驗。通過setOnErrorListener(android.media.MediaPlayer.OnErrorListener)可以設置該監聽器。如果MediaPlayer進入了Error狀態,可以通過調用reset()來恢復,使得MediaPlayer重新返回到Idle狀態。