2014-08-31 279 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类。有关线程的更多信息,请参阅 “进程和线程”文档。

请记住,如果你使用一个服务,它仍然在默认情况下,您的 应用程序的主线程中运行,所以你还是应该在服务中创建一个新的线程 如果性能密集型或阻塞 操作。