我想实现基本的媒体播放器功能,并且在PrepareAsync()之间感到困惑 和Prepare()方法调用。如果音频文件位于原始文件夹中,应使用哪一个。
答案 0 :(得分:11)
这些方法之间的区别主要在于它们执行的线程。
Prepare
在您调用它的线程(最常见的UI线程)中运行,因此如果需要很长时间(从Internet缓冲视频等),它将阻止您的UI线程,用户可能会获得ANR。
PrepareAsync
在后台线程中运行,因此UI线程不会被阻止,因为它几乎立即返回。但是播放器没有准备好,所以你想设置onPreparedListener
以便知道MediaPlayer
何时可以使用。
答案 1 :(得分:9)
prepare()方法。 当我们想要异步播放时,通常会使用prepareAsync()。
例如:
mediaplayer.prepare()
用于从本地媒体资源播放文件。
mediaplayer.prepareAsync()通常用于在流上播放实时数据。它允许在不阻塞主线程的情况下播放。
如果我们使用prepare()
进行实时数据流传输,它最终会崩溃,因为数据是在流中接收的。
基本上prepare()
首先加载所有数据,然后播放。因此,它允许同步播放媒体文件。
prepareAsync()
播放缓冲区中的数据。
这是最后的行情
这是Prepared的两种方式(同步与异步) 可以达到状态:要么调用prepare()(同步)哪个 方法调用后,将对象传输到Prepared状态 首先返回,或者调用prepareAsync()(异步) 在调用返回后将对象传送到准备状态 (内部玩家引擎)(几乎正确的方式发生) 继续研究其余的准备工作,直到 准备工作完成。准备完成时或何时完成 prepare()调用返回,内部播放器引擎然后调用用户 提供了回调方法,OnPreparedListener的onPrepared() 接口,如果事先通过注册OnPreparedListener setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)。
主要区别在于,当我们使用文件时,我们调用prepare(),当我们使用流时,我们调用prepareAsync()。
在你的情况下,它必须是prepare()方法
检查prepareAsync()和prepare(),参考明确说明的文档