2014-08-31 219 views
2

我已經構建了一個運行在服務上的音樂播放器。 通過綁定到我的活動中的服務,我正在播放,暫停,下一首歌曲,上一首歌曲等各種操作。關於MusicService的困惑

它工作得很好。

對我的問題: 將服務放在新線程上是否理想?我知道Service在Main/UI線程上默認運行。 如果不是,我怎麼知道什麼時候將某些東西放在新線程上?我可以將整個Service實例放在新的線程中,還是隻放在Service中的一部分代碼中?

我想這被稱爲長時間運行的服務,不應該在自己的線程不阻止用戶界面?

調試時我可以在Logcat中看到:I/Choreographer(691):跳過了60幀!該應用程序可能在其主線程上做了太多工作...... 這讓我想到了! :0

正如我的標題所說,我對此很困惑!

回答

1

你說得對,服務不是線程(它們不會創建不同的線程)。 當從一個活動開始時,它們會阻止運行長操作的主/ UI線程fi。 你可以使用IntentService - 它們啓動自己的線程來執行後臺長時間運行操作 - 但這可能會比播放音樂更適合下載文件任務或長時間運行計算。 請注意,IntentService創建並破壞線程(當工作完成時)。

另一種選擇是手動創建自己的線程。

這就是說,我會考慮的這篇文章: http://developer.android.com/guide/topics/media/mediaplayer.html 它談論使用startForeground()前臺服務增加了一個通知狀態欄,讓用戶知道一個事實,即服務正在運行 - 以及促進服務,以便在內存不足的情況下不會被破壞(可能是 - 但它可能是最後一次關閉)。 的例子是有關運行的媒體播放器,同時採取主線程阻塞考慮和處理系統事件,暫停和播放音樂如預期(使用BroadcastReceiver

還應注意這個: http://developer.android.com/guide/components/services.html

你應該使用服務還是線程?

服務只是一個組件,當用戶沒有與應用程序進行交互時,該服務只能在後臺運行,即使在 也可以運行。因此,只有在您需要的情況下,您纔可以創建服務。

如果您需要在您的主線程外執行工作,但只有在用戶正在與應用程序進行交互時,那麼您應該創建一個新線程而不是服務。例如, 如果您想播放一些音樂,但只有在您的活動 正在運行時,您可以在onCreate()中創建一個線程,在onStart()中開始運行 ,然後在onStop()中停止它。也可以考慮使用AsyncTask或HandlerThread,而不是傳統的Thread類。有關線程的更多信息,請參閱 「進程和線程」文檔。

請記住,如果你使用一個服務,它仍然在默認情況下,您的 應用程序的主線程中運行,所以你還是應該在服務中創建一個新的線程 如果性能密集型或阻塞 操作。