UI线程或背景中的Android音乐播放器

时间:2016-02-06 17:17:26

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

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

  1. 默认情况下,服务在UI线程上运行,不是吗?只有当它在单独的进程中运行时,它才有另一个线程,以及上下文,因为它是系统中的另一个进程(虚拟机实例的分支)
  2. 应该使用MediaPlayer类?在后台服务或UI线程中。对于在UI线程上运行的绑定服务,如果它在UI线程上运行,则创建服务绑定等没有任何意义吗?仅在我们想要在活动(或任何UI组件被破坏)的情况下继续在后台播放音乐的情况下,但在这种情况下,即使用户无法看到UI,MusicPlayer也会占用整个UI线程。我是对的吗?
  3. 我发现了很多关于如何创建简单音频播放器的教程,其中很少有人展示如何直接从服务中运行在单独的线程中,有些只是直接使用IBinder类直接进行服务,而这只是返回服务实例。
  4. 请解释这个主题。 我将不胜感激任何帮助。 感谢。

1 个答案:

答案 0 :(得分:0)

Android MediaPlayer背后的一个棘手问题是,有许多实现的行为略有不同。尽管如此,界面很常见,所以我们可以谈论这个问题。除了prepare之外,可以从UI线程调用所有MediaPlayer生命周期方法。为了简化操作,有prepareAsync方法,可以从UI线程调用。

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

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

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