我正在構建一個從網絡服務器傳輸音樂的應用程序。該應用程序具有使用MediaPlayer播放的前臺服務。MediaPlayer應該在單獨的線程中運行嗎?
我的代碼是基於這個例子:http://developer.android.com/guide/topics/media/mediaplayer.html
在這個例子中,沒有擰除了prepareAsync()調用。令我困惑的是,當我讀到服務類時,我發現這些信息:
「警告:服務在主機進程的主線程中運行 - 服務不會創建自己的線程並且不會運行一個單獨的進程(除非你另有指定),這意味着,如果你的服務要做任何CPU密集型工作或者阻塞操作(比如MP3播放或者網絡連接),你應該在服務中創建一個新線程來完成這個工作。通過使用單獨的線程,您將降低應用程序無響應(ANR)錯誤的風險,並且應用程序的主線程可以保持專用於用戶與您的活動進行交互。「
我問的原因是,應用程序有時(通常在丟失連接時)會在流式傳輸音頻時凍結UI。我完全理解,如果服務使CPU工作密集,UI會凍結,因爲活動和服務在同一線程上運行。但是,我應該期待MediaPlayer如此激烈嗎?也就是說,它是否應該在單獨的線程上運行?
readh ere http://stackoverflow.com/questions/8915618/mediaplayer-in-separate-thread-vs-running-in-service-via-startforeground – 2013-03-27 12:22:48
我肯定會建議不要阻止對Audiomanager的調用,MediaPlayer,AudioRecord等從您的應用程序的主線程。如果音頻系統暫時陷入停頓狀態 - 或完全停止響應 - 出於某種原因,您最終只能在您的應用中使用ANR,並且不會對任何人都有用。 – Michael 2013-03-27 15:28:38
感謝您的回覆@Michael!我完全同意你的看法,即阻止調用應該在單獨的線程中運行。但是,我是否應該期望媒體播放被阻止?我無法找到一種方式來判斷媒體播放器是否正在變得「阻塞」,或者是什麼原因造成了這種情況。這隻會發生在乘坐汽車或火車旅行時流過rtsp的情況。也許改變細胞塔可能是一個問題?目前,我依靠MediaPlayer來解決這個問題,這在大多數時候都是如此。 – smult 2013-04-02 11:37:08