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

Android MediaPlayer应该在单独的线程中运行吗?,android,multithreading,service,streaming,media-player,Android,Multithreading,Service,Streaming,Media Player,我正在构建一个应用程序,可以从web服务器流式传输音乐。该应用具有使用MediaPlayer进行播放的前台服务 我的代码基于以下示例: 在本例中,除了prepareAsync()调用外,没有任何线程。让我困惑的是,当我阅读有关服务类的信息时,我发现以下信息: “注意:服务在其宿主进程的主线程中运行。该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)。这意味着,如果您的服务将执行任何CPU密集型工作或阻塞操作(如MP3播放或联网),您应该在服务中创建一个新线程来完成该工作。通过使

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

我的代码基于以下示例:

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

“注意:服务在其宿主进程的主线程中运行。该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)。这意味着,如果您的服务将执行任何CPU密集型工作或阻塞操作(如MP3播放或联网),您应该在服务中创建一个新线程来完成该工作。通过使用单独的线程,您将降低应用程序不响应(ANR)错误的风险,并且应用程序的主线程可以专用于用户与您的活动的交互。”


我问这个问题的原因是,应用程序有时(通常在断开连接时)会在流式播放音频时冻结用户界面。我完全理解,如果服务让CPU密集型工作,UI会冻结,因为活动和服务运行在同一个线程上。但是,我是否应该期待MediaPlayer如此激烈?也就是说,它是否应该在单独的线程上运行?

否如果您正在进行任何网络传输,您应该将其保存在一个线程中,mediaplayer并不是资源密集型的。将其保留在您的活动中。

流媒体音乐是否会导致主线程停止,直到音乐完成流媒体播放?这可能就是为什么它正在放慢速度


我不是专家,目前正在自学,但这是值得思考的。

不幸的是,调用prepareAsync()不足以避免ANR提示和应用程序挂起几秒钟,尤其是在网络上播放文件时。最好将MediaPlayer实例放在自己的线程中,或者至少在处理程序中执行密集调用(如
MediaPlayer.start()
)。我已经使用MediaPlayer一年多了,我可以告诉你,它在接到各种电话后肯定会挂起,这取决于具体情况

读到这里,我绝对建议不要从应用程序的主线程对Audiomanager、MediaPlayer、AudioRecord等进行任何阻塞调用。如果音频系统暂时陷入困境——或者完全停止响应——出于某种原因,你的应用程序中只会出现一个ANR,以及一个可能对任何人都没有用处的错误报告。谢谢你的回复@Michael!我完全同意你的观点,阻塞调用应该在一个单独的线程中运行。但是,我是否应该期望媒体播放变得阻塞?我只是找不到一种方法来判断媒体播放器是否正在变得“阻塞”,或者是什么原因导致了这种情况。这只发生在我开车或坐火车旅行时通过rtsp流媒体时。也许换个手机发射塔会有问题?目前,我依靠MediaPlayer来解决这个问题,大多数情况下都是这样。我不记得有哪些方法是同步的,哪些是非同步的。但是,如果文档中没有说明给定的方法是异步的,那么您应该假设它可能需要无限长的时间才能返回。在大多数情况下,这段时间不足以导致应用程序重新启动。但是,为了避免ANR,即使在这些方法不能及时返回的情况下(无论出于何种原因),您也不应该从主线程调用它们。您不希望将mediaplayer保留在活动中,因为即使活动被破坏,它也应该运行。您应该在前台服务中运行它。