android - 单独线程中的 MediaPlayer 与通过 startForeground() 在服务中运行

标签 android

因此,我在单独的线程中播放音乐。如果我离开应用程序(onPause()onStop() 被调用等),音乐会继续播放,但最终——在打开其他应用程序并在它们之间切换之后他们然后回到主屏幕——我的应用程序被杀死了。没有崩溃,只有 WIN DEATHprocess com.myapp.android has died 在 logcat 中。显然,应用程序被系统销毁以回收资源是合法的。

我的问题是:在主 (UI) 线程之外的线程中运行内容是否意味着它现在就系统而言具有较低的优先级?意思是,它是否比我在 Service 中运行媒体播放器甚至使用 startForeground() 使服务在前台运行更容易被杀死?

任何想法或澄清将不胜感激!

编辑

此外,有关服务的部分文档让我感到困惑。在相关部分,它指出:

Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work.

我一直在主线程的服务中运行 MP3 播放,并且 UI 保持响应。如果我应该按照上面引文中的建议将它放在一个单独的线程中,那么我不会回到我开始的地方,即媒体播放发生在主线程之外,从而增加播放的可能性在打开其他应用程序等时被杀死?

最佳答案

我刚刚在其他地方发布了这个答案的一部分,但它仍然相关。

不幸的是,调用 prepareAsync() 根本不足以避免 ANR 提示和您的应用程序挂起几秒钟,尤其是当您正在播放来自网络的文件时。最好的办法是将 MediaPlayer 实例放在它自己的线程中,或者至少在 Handler 中执行密集调用(如 mediaplayer.start())。我已经使用 MediaPlayer 一年多了,我可以告诉你它肯定会在多次调用后挂起,具体取决于具体情况。

理想情况下,您应该从服务生成一个线程来控制您的 MediaPlayer。通过这种方式,您可以确保您的媒体在您的应用程序处于后台时继续播放,并且任何阻塞调用(除了 prepare()/prepareAsync())不会挂起您的应用程序。

关于android - 单独线程中的 MediaPlayer 与通过 startForeground() 在服务中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915618/

相关文章:

android - 调用带 * 字符的电话号码

android - 在 Android 中获取当前活跃用户

android - 流改造的意外结束

Android - QVGA 屏幕隐藏了一些像素

android - 使用 Intent 重新启动当前 Activity

android - 有什么方法可以异步调用 Geocoder.getFromLocation 吗?

android - 有 View 换行内容,但如果空间可用则匹配父级

android - Eclipse 不构建项目,或者构建时间太长

java - 日期转换为不同的语言环境

Android 通知操作 - Intent Extra 未按预期工作