gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:38 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于java - UI线程或后台的Android音乐播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35243947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com