2013-03-27 79 views
12

我正在構建一個從網絡服務器傳輸音樂的應用程序。該應用程序具有使用MediaPlayer播放的前臺服務。MediaPlayer應該在單獨的線程中運行嗎?

我的代碼是基於這個例子:http://developer.android.com/guide/topics/media/mediaplayer.html

在這個例子中,沒有擰除了prepareAsync()調用。令我困惑的是,當我讀到服務類時,我發現這些信息:

「警告:服務在主機進程的主線程中運行 - 服務不會創建自己的線程並且不會運行一個單獨的進程(除非你另有指定),這意味着,如果你的服務要做任何CPU密集型工作或者阻塞操作(比如MP3播放或者網絡連接),你應該在服務中創建一個新線程來完成這個工作。通過使用單獨的線程,您將降低應用程序無響應(ANR)錯誤的風險,並且應用程序的主線程可以保持專用於用戶與您的活動進行交互。「

我問的原因是,應用程序有時(通常在丟失連接時)會在流式傳輸音頻時凍結UI。我完全理解,如果服務使CPU工作密集,UI會凍結,因爲活動和服務在同一線程上運行。但是,我應該期待MediaPlayer如此激烈嗎?也就是說,它是否應該在單獨的線程上運行?

+0

readh ere http://stackoverflow.com/questions/8915618/mediaplayer-in-separate-thread-vs-running-in-service-via-startforeground – 2013-03-27 12:22:48

+1

我肯定會建議不要阻止對Audiomanager的調用,MediaPlayer,AudioRecord等從您的應用程序的主線程。如果音頻系統暫時陷入停頓狀態 - 或完全停止響應 - 出於某種原因,您最終只能在您的應用中使用ANR,並且不會對任何人都有用。 – Michael 2013-03-27 15:28:38

+0

感謝您的回覆@Michael!我完全同意你的看法,即阻止調用應該在單獨的線程中運行。但是,我是否應該期望媒體播放被阻止?我無法找到一種方式來判斷媒體播放器是否正在變得「阻塞」,或者是什麼原因造成了這種情況。這隻會發生在乘坐汽車或火車旅行時流過rtsp的情況。也許改變細胞塔可能是一個問題?目前,我依靠MediaPlayer來解決這個問題,這在大多數時候都是如此。 – smult 2013-04-02 11:37:08

回答

-2

不,如果你正在做任何網絡傳輸,你應該保持在一個線程,mediaplayer不是那種資源密集型。保持你的活動。

+1

您不希望將媒體播放器保存在活動中,因爲即使活動被破壞,它也應該運行。你應該在前臺服務中運行它。 – smult 2013-09-23 11:43:42

0

流音樂是否會導致主線程停止,直到音樂完成流式傳輸?這可能是它爲什麼會放慢速度的原因。

我不是專家,我目前在學習自己,但它值得思考。

12

不幸的是,調用prepareAsync()並不足以避免ANR提示和應用程序掛起幾秒鐘,特別是當您從網絡中播放文件時。最好的辦法是將MediaPlayer實例放入其自己的線程中,或至少在處理程序中執行密集型調用(如mediaplayer.start())。我已經使用了MediaPlayer一年多了,我可以告訴你,根據具體情況,它會在各種調用之後肯定掛起。

相關問題