Android MediaPlayer.start()也应该是一个新线程吗?

Android MediaPlayer.start()也应该是一个新线程吗?,android,android-asynctask,android-mediaplayer,Android,Android Asynctask,Android Mediaplayer,这里的教程解释了服务实际上使用主线程。因此,它使用prepareAsync来避免阻塞UI: 我想知道异步回调onPrepared在哪里运行。在示例中,onPrepared调用MediaPlayer的开始。启动也是CPU密集型方法吗?如果它在同一线程中运行,它也会阻塞。MediaPlayer.start()至少不是一个密集型操作。MediaPlayer使用它自己的本机线程来执行任务,但是对同步prepare方法的调用可能会占用UI线程太长的时间,特别是当您尝试播放的是远程媒体时。在这种情况下,它

这里的教程解释了服务实际上使用主线程。因此,它使用
prepareAsync
来避免阻塞UI:


我想知道异步回调
onPrepared
在哪里运行。在示例中,
onPrepared
调用
MediaPlayer
的开始。启动也是CPU密集型方法吗?如果它在同一线程中运行,它也会阻塞。

MediaPlayer.start()
至少不是一个密集型操作。
MediaPlayer
使用它自己的本机线程来执行任务,但是对同步
prepare
方法的调用可能会占用UI线程太长的时间,特别是当您尝试播放的是远程媒体时。在这种情况下,它必须等待一个或多个网络请求、要缓冲的数据等。如果在主线程上调用了
prepareAsync
(或者更准确地说,从哪个线程调用它),
onPrepared
回调将发生在主线程上。

这个答案是否相反?取决于具体情况
start()
绝对不是一个“密集调用”,在
处理程序中运行它并不自动意味着它将在不同的线程中运行。也就是说,IMO的最佳设置是将
MediaPlayer
放在一个
服务
中,该服务在自己的进程中运行。这个答案仅仅解决了OP提出的问题,因为它与链接中的示例有关。根据我的经验,如果媒体播放器没有移动到自己的线程,那么多轨音频(八个同时的MP3)实际上会导致一些性能问题。