【问题标题】:Android:Media Player difference between PrepareAsync() and Prepare()Android:媒体播放器 PrepareAsync() 和 Prepare() 的区别
【发布时间】:2014-08-22 11:54:45
【问题描述】:

我想实现基本的媒体播放器功能,但对 PrepareAsync() 感到困惑 和 Prepare() 方法调用。如果音频文件在 raw 文件夹中,应该使用哪一个。

【问题讨论】:

  • 两者最后都做同样的事情,但是 Prepare() 在准备完成之前不会返回,而 PrepareAsync 会立即返回并在后台进行准备。
  • 这意味着假设我有例如 10 min 的音频剪辑。 . PrepareAsync 将立即返回前几秒钟的音频,并且准备可能需要更长的时间才能读取文件,但一旦完成,它将返回整个文件的对象?
  • 在准备完成之前不能开始演奏,否则会出现异常。使用 PrepareAsync(),您必须自己在 onPreparedListener 的“onPrepared”方法中开始播放。

标签: android android-mediaplayer


【解决方案1】:

这些方法之间的区别基本上在于它们执行的线程。

Prepare 在您调用它的线程(最常见的 UI 线程)中运行,因此如果需要很长时间(缓冲来自 Internet 的视频等),它将阻塞您的 UI 线程并且用户可能会遇到 ANR。

PrepareAsync 在后台线程中运行,因此 UI 线程不会被阻塞,因为它几乎立即返回。但是播放器还没有准备好,所以你想设置onPreparedListener,以便知道MediaPlayer何时可以使用。

【讨论】:

  • 但如果用例是基本的,在我的情况下是(即从原始文件夹资源读取),我可以使用 Prepare() 方法。在这种情况下它会工作得更快吗?
  • 它可能会运行得更快一些(尽管我怀疑你是否注意到它)。您可以自己尝试一下,看看它是否阻塞了您的 UI,如果没有,您可以使用prepare 方法,但通常最好使用prepareAsync,因为它不会在将来产生问题。
【解决方案2】:

prepare() 方法通常用于我们想要同步播放我们的媒体文件时。 prepareAsync() 一般在我们想异步播放的时候使用。

例如:

mediaplayer.prepare()

用于播放本地媒体资源中的文件。

mediaplayer.prepareAsync() 通常用于通过流播放实时数据。它允许在不阻塞主线程的情况下播放。 如果我们使用prepare() 进行实时数据流传输,它最终会崩溃,因为数据是在流中接收的。 基本上prepare() 首先加载所有数据然后播放。因此它允许同步播放媒体文件。 prepareAsync() 播放缓冲区中的任何数据。

这是最后的报价

Prepared 有两种方式(同步与异步) 可以达到状态:调用 prepare()(同步) 一旦方法调用,将对象转移到 Prepared 状态 返回,或者调用 prepareAsync() (异步),它首先 调用返回后将对象转移到 Preparing 状态 (几乎以正确的方式发生)而内部播放器引擎 继续进行其余的准备工作,直到 准备工作完成。准备完成时或 prepare() 调用返回,然后内部播放器引擎调用用户 提供的回调方法,OnPreparedListener 的 onPrepared() 接口,如果一个 OnPreparedListener 是通过预先注册的 setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener).

主要区别在于,当我们使用文件时调用prepare(),使用流时调用prepareAsync()。

在你的情况下,它必须是 prepare() 方法

检查prepareAsync()prepare() 请参阅其明确说明的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多