|
Android MediaPlayer的生命周期 MediaPlayer的狀態(tài)轉(zhuǎn)換圖也表征了它的生命周期,搞清楚這個圖可以幫助我們在使用MediaPlayer時考慮情況更周全,寫出的代碼也更具健壯性。
這張狀態(tài)轉(zhuǎn)換圖清晰的描述了MediaPlayer的各個狀態(tài),也列舉了主要的方法的調(diào)用時序,每種方法只能在一些特定的狀態(tài)下使用,如果使用時MediaPlayer的狀態(tài)不正確則會引發(fā)IllegalStateException異常。
Idle 狀態(tài):當(dāng)使用new()方法創(chuàng)建一個MediaPlayer對象或者調(diào)用了其reset()方法時,該MediaPlayer對象處于idle狀態(tài)。這兩種方法的一個重要差別就是:如果在這個狀態(tài)下調(diào)用了getDuration()等方法(相當(dāng)于調(diào)用時機(jī)不正確),通過reset()方法進(jìn)入idle狀態(tài)的話會觸發(fā)OnErrorListener.onError(),并且MediaPlayer會進(jìn)入Error狀態(tài);如果是新創(chuàng)建的MediaPlayer對象,則并不會觸發(fā)onError(),也不會進(jìn)入Error狀態(tài)。
End 狀態(tài):通過release()方法可以進(jìn)入End狀態(tài),只要MediaPlayer對象不再被使用,就應(yīng)當(dāng)盡快將其通過release()方法釋放掉,以釋放相關(guān)的軟硬件組件資源,這其中有些資源是只有一份的(相當(dāng)于臨界資源)。如果MediaPlayer對象進(jìn)入了End狀態(tài),則不會在進(jìn)入任何其他狀態(tài)了。
Initialized 狀態(tài):這個狀態(tài)比較簡單,MediaPlayer調(diào)用setDataSource()方法就進(jìn)入Initialized狀態(tài),表示此時要播放的文件已經(jīng)設(shè)置好了。
Prepared 狀態(tài):初始化完成之后還需要通過調(diào)用prepare()或prepareAsync()方法,這兩個方法一個是同步的一個是異步的,只有進(jìn)入Prepared狀態(tài),才表明MediaPlayer到目前為止都沒有錯誤,可以進(jìn)行文件播放。
Preparing 狀態(tài):這個狀態(tài)比較好理解,主要是和prepareAsync()配合,如果異步準(zhǔn)備完成,會觸發(fā)OnPreparedListener.onPrepared(),進(jìn)而進(jìn)入Prepared狀態(tài)。
Started 狀態(tài):顯然,MediaPlayer一旦準(zhǔn)備好,就可以調(diào)用start()方法,這樣MediaPlayer就處于Started狀態(tài),這表明MediaPlayer正在播放文件過程中??梢允褂?/span>isPlaying()測試MediaPlayer是否處于了Started狀態(tài)。如果播放完畢,而又設(shè)置了循環(huán)播放,則MediaPlayer仍然會處于Started狀態(tài),類似的,如果在該狀態(tài)下MediaPlayer調(diào)用了seekTo()或者start()方法均可以讓MediaPlayer停留在Started狀態(tài)。
Paused 狀態(tài):Started狀態(tài)下MediaPlayer調(diào)用pause()方法可以暫停MediaPlayer,從而進(jìn)入Paused狀態(tài),MediaPlayer暫停后再次調(diào)用start()則可以繼續(xù)MediaPlayer的播放,轉(zhuǎn)到Started狀態(tài),暫停狀態(tài)時可以調(diào)用seekTo()方法,這是不會改變狀態(tài)的。
Stop 狀態(tài):Started或者Paused狀態(tài)下均可調(diào)用stop()停止MediaPlayer,而處于Stop狀態(tài)的MediaPlayer要想重新播放,需要通過prepareAsync()和prepare()回到先前的Prepared狀態(tài)重新開始才可以。
PlaybackCompleted狀態(tài):文件正常播放完畢,而又沒有設(shè)置循環(huán)播放的話就進(jìn)入該狀態(tài),并會觸發(fā)OnCompletionListener的onCompletion()方法。此時可以調(diào)用start()方法重新從頭播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()來重新定位播放位置。
Error狀態(tài):如果由于某種原因MediaPlayer出現(xiàn)了錯誤,會觸發(fā)OnErrorListener.onError()事件,此時MediaPlayer即進(jìn)入Error狀態(tài),及時捕捉并妥善處理這些錯誤是很重要的,可以幫助我們及時釋放相關(guān)的軟硬件資源,也可以改善用戶體驗。通過setOnErrorListener(android.media.MediaPlayer.OnErrorListener)可以設(shè)置該監(jiān)聽器。如果MediaPlayer進(jìn)入了Error狀態(tài),可以通過調(diào)用reset()來恢復(fù),使得MediaPlayer重新返回到Idle狀態(tài)。
參考文檔:AndroidSDK1.5官方文檔:android-sdk-windows-1.5_r3/docs/reference/android/media/MediaPlayer.html |
|
|