我已经构建了一个运行在服务上的音乐播放器。 我通过绑定我活动中的服务,将各种动作预演成播放,暂停,下一首歌,上一首歌等。
完全正常。
所以对我的问题: 将服务放在新线程上是否理想?我知道Service在Main / UI线程上默认运行。 如果没有,我怎么知道何时在新线程上实际放置东西?我可以将整个Service实例放在新线程上,还是只放在服务中的部分代码中?
我猜这是一个长期运行的服务,不应该在自己的线程上阻止UI吗?
调试时我可以在Logcat中看到:I / Choreographer(691):跳过60帧!应用程序可能在其主线程上做了太多工作...... 这让我也想知道! :○
正如我的标题所说,我对此非常困惑!
答案 0 :(得分:1)
你是对的,服务不是线程(它们不会创建不同的线程)。
当从一个活动开始时,他们会阻止运行长操作的主/ UI线程。
您可以使用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类。见 进程和线程文档以获取有关线程的更多信息。
请记住,如果您使用某项服务,它仍会在您的服务中运行 默认情况下,应用程序的主线程,所以你仍然应该创建一个新的 服务中的线程,如果它执行密集或阻塞 操作