android - MediaPlayer 应该在单独的线程中运行吗?

标签 android multithreading service streaming media-player

我正在构建一个从网络服务器流式传输音乐的应用程序。该应用程序具有使用 MediaPlayer 进行播放的前台服务。

我的代码基于这个例子:http://developer.android.com/guide/topics/media/mediaplayer.html

在该示例中,除了 prepareAsync() 调用外,没有任何线程。让我感到困惑的是,当我阅读有关 Service 类的信息时,我发现了以下信息:

“警告:服务在其托管进程的主线程中运行——该服务不会创建自己的线程,也不在单独的进程中运行(除非您另有说明)。这意味着,如果您的服务将执行任何 CPU 密集型工作或阻塞操作(例如 MP3 播放或网络),您应该在服务中创建一个新线程来完成该工作。通过使用单独的线程,您将降低应用程序无响应的风险(ANR) 错误,应用程序的主线程可以继续专用于用户与您的 Activity 的交互。”

我问的原因是应用程序有时(通常是在断开连接时)在流式传输音频时卡住 UI。我完全理解如果服务使 CPU 密集工作,UI 会卡住,因为 Activity 和服务在同一个线程上运行。但是,我应该期望 MediaPlayer 如此激烈吗?也就是说,它应该在单独的线程上运行吗?

最佳答案

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

关于android - MediaPlayer 应该在单独的线程中运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15658583/

相关文章:

android - 如何在 aws device farm 中每次运行 android espresso 测试后清除设备数据

java - Gradle 同步失败版本不支持 ModelBuilder API,而版本为 3.3

c# - 在以下情况下,我应该使用线程安全集合吗?

Java主类在线程执行之前结束

c# - 线程安全静态类和构造函数

java - 线程中的异常 "main"java.lang.IllegalArgumentException : Trying to set foreign cookie

asp.net - XML 解析错误 : no element found

c++ - 为什么我不能在 Windows Server 2008 中使用 system() 从服务启动批处理文件?

带标题的 Android ListView

android导航组件向上按钮,箭头显示但popTo不起作用