【问题标题】:Android music player in UI thread or backgroundUI线程或背景中的Android音乐播放器
【发布时间】:2016-05-16 14:22:18
【问题描述】:

我正在尝试创建简单的 Android 应用程序来播放 sd 卡中的音频文件。
我在理解服务方面遇到了一些问题。 我会具体一点,这是我的问题。

  1. 服务默认在 UI 线程上运行,不是吗?仅当它在单独的进程中运行时,它才有另一个线程和上下文,因为它是系统中的另一个进程(虚拟机实例的分支)
  2. 应该在哪里使用MediaPlayer 类?在后台服务或 UI 线程中。至于绑定服务在UI线程上运行,如果它在UI线程上运行,创建服务绑定等没有任何意义?仅在我们想在活动(或任何 UI 组件被破坏)时继续在后台播放音乐的情况下,但在这种情况下,即使用户不可见 UI,MusicPlayer 也会占用整个 UI 线程。我说的对吗?
  3. 我发现了大量的教程如何创建简单的音频播放器,其中很少有说明如何直接从服务在单独的线程中运行,其他人只是直接从活动中使用 IBinder 类在服务中运行,该类只返回服务实例。

请解释一下这个话题。 如果有任何帮助,我将不胜感激。 谢谢。

【问题讨论】:

  • 你应该阅读that,如果你还没有阅读过that,因为这两个网站基本上涵盖了有关android媒体播放的所有内容
  • 感谢 cmets 但我已经读过了。
  • 首先,不能在ui线程上播放媒体!它应该在 Foreground-Service 中完成(普通服务,通过调用 startForeground() 启动)。 MediaPlayer 应该是您的服务的一部分,最后,我认为您看到的教程还可以。如果你想要的话,我也有一些示例代码(我实际上正在构建我自己的音乐应用程序)!

标签: java android multithreading android-service audio-player android-music-player


【解决方案1】:

Android MediaPlayer 背后的一个棘手问题是有许多实现方式略有不同。尽管如此,界面是常见的,所以我们可以谈论它。除prepare 外,所有MediaPlayer 生命周期方法都可以从UI 线程调用。为方便起见,有prepareAsync 方法,可以从UI 线程调用。

在内部,MediaPlayer 应该与音频系统交互,在任何情况下都不会在调用线程上进行解码和播放。

可以在另一个线程上创建MediaPlayer。但是,正如the documentation 中所述,该线程必须有自己的Looper(UI 线程拥有)。因此,不应在异步任务中创建 MediaPlayer

顺便说一句,我注意到在主线程上调用 start 方法时偶尔会出现 ANR(这让我看到了你的帖子)。然而,这些非常罕见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多