Android音乐播放器在UI线程或后台运行?

5

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

  1. 默认情况下,服务在UI线程上运行,对吗?只有在它运行在单独的进程中时,它才有另一个线程,以及上下文,因为它是系统中的另一个进程(虚拟机实例的分支)
  2. MediaPlayer类应该在哪里使用?在后台服务还是在UI线程中。由于绑定服务在UI线程上运行,如果它在UI线程上运行,那么创建服务绑定等就没有意义了?只有在我们想要在后台继续播放音乐而活动(或任何UI组件被销毁)时,但在这种情况下,MusicPlayer将占用整个UI线程,即使用户看不到UI。我是对的吗?
  3. 我已经找到了大量关于如何创建简单音频播放器的教程,其中几个展示了如何直接从服务中的单独线程运行,其他人则直接在活动中使用IBinder类从服务中运行,该类仅返回服务的实例。

请解释这个主题。 我将非常感谢任何帮助。 谢谢。


1
你应该阅读这个,如果你还没有阅读的话,也应该看看这个,因为这两个网站基本上涵盖了Android上媒体播放的所有内容。 - David Medenjak
1
请查看此教程:http://code.tutsplus.com/tutorials/create-a-music-player-on-android-user-controls--mobile-22787 - Sreehari
谢谢您的评论,但我已经阅读过了。 - user4881271
首先,媒体播放不能在UI线程上完成!它应该在前台服务中完成(普通服务,通过调用startForeground()启动)。MediaPlayer应该是您的服务的一部分,最后,我认为您看到的教程是可以的。如果您需要一些示例代码(我实际上正在构建自己的音乐应用程序),我也有一些。 - the_dani
1个回答

1

Android MediaPlayer 的一个棘手问题是有许多实现具有略微不同的行为。尽管如此,接口是通用的,因此我们可以谈论它。所有的 MediaPlayer 生命周期方法都可以从 UI 线程调用,除了 prepare。为了使事情更容易,有 prepareAsync 方法,可以从 UI 线程调用。

在内部,MediaPlayer 应以一种方式与音频系统交互,以便在任何情况下都不会在调用线程上发生解码和播放。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接