UI线程或后台的Android音乐播放器

5 java multithreading android audio-player android-service android-music-player

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

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

请解释这个话题。我将不胜感激任何帮助。谢谢。

Tad*_*Tad 1

Android MediaPlayer 背后的棘手问题之一是,有许多行为略有不同的实现。尽管如此,界面是通用的,所以我们可以讨论一下。所有 MediaPlayer 生命周期方法都可以从 UI 线程调用,除了prepare. 为了让事情变得更简单,有一个prepareAsync方法,可以从 UI 线程调用。

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

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

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