UI线程或背景中的Android音乐播放器
Posted
技术标签:
【中文标题】UI线程或背景中的Android音乐播放器【英文标题】:Android music player in UI thread or background 【发布时间】:2016-05-16 14:22:18 【问题描述】:我正在尝试创建简单的 android 应用程序来播放 sd 卡中的音频文件。 我在理解服务方面遇到了一些问题。 我会具体一点,这是我的问题。
-
服务默认在 UI 线程上运行,不是吗?仅当它在单独的进程中运行时,它才有另一个线程和上下文,因为它是系统中的另一个进程(虚拟机实例的分支)
应该在哪里使用
MediaPlayer
类?在后台服务或 UI 线程中。至于绑定服务在UI线程上运行,如果它在UI线程上运行,创建服务绑定等没有任何意义?仅在我们想在活动(或任何 UI 组件被破坏)时继续在后台播放音乐的情况下,但在这种情况下,即使用户不可见 UI,MusicPlayer 也会占用整个 UI 线程。我说的对吗?
我发现了大量的教程如何创建简单的音频播放器,其中很少有说明如何直接从服务在单独的线程中运行,其他人只是直接从活动中使用 IBinder
类在服务中运行,该类只返回服务实例。
请解释一下这个话题。 如果有任何帮助,我将不胜感激。 谢谢。
【问题讨论】:
你应该阅读that,如果你还没有阅读过that,因为这两个网站基本上涵盖了有关android媒体播放的所有内容 查看本教程code.tutsplus.com/tutorials/… 感谢 cmets 但我已经读过了。 首先,不能在ui线程上播放媒体!它应该在 Foreground-Service 中完成(普通服务,通过调用 startForeground() 启动)。 MediaPlayer 应该是您的服务的一部分,最后,我认为您看到的教程还可以。如果你想要的话,我也有一些示例代码(我实际上正在构建我自己的音乐应用程序)! 【参考方案1】:Android MediaPlayer 背后的一个棘手问题是有许多实现方式略有不同。尽管如此,界面是常见的,所以我们可以谈论它。除prepare
外,所有MediaPlayer 生命周期方法都可以从UI 线程调用。为方便起见,有prepareAsync
方法,可以从UI 线程调用。
在内部,MediaPlayer 应该与音频系统交互,在任何情况下都不会在调用线程上进行解码和播放。
可以在另一个线程上创建MediaPlayer
。但是,正如the documentation 中所述,该线程必须有自己的Looper
(UI 线程拥有)。因此,不应在异步任务中创建 MediaPlayer
。
顺便说一句,我注意到在主线程上调用 start
方法时偶尔会出现 ANR(这让我看到了你的帖子)。然而,这些非常罕见。
【讨论】:
以上是关于UI线程或背景中的Android音乐播放器的主要内容,如果未能解决你的问题,请参考以下文章
Android MediaPlayer 背景音乐线程随机停止