Android MediaPlayer setDataSource需要最佳实践建议

Android MediaPlayer setDataSource需要最佳实践建议,android,media-player,Android,Media Player,在阅读了“”和“”android文档之后,我仍然感到困惑,需要有经验的关于重载方法的建议 我正在我的项目中的Service组件中使用MediaPlayer,该组件将在播放音乐时使用。我的音乐文件(.mp3)在apk的res/raw文件夹中。 要开始播放,我知道我必须准备MediaPlayer对象。因为android应用程序中的服务默认使用单进程和主线程,所以我不希望我的用户 当MediaPlayer自行准备时(想想原始文件夹中的媒体文件是否有较大的大小)。 然后我使用prepareAsync而不

在阅读了“”和“”android文档之后,我仍然感到困惑,需要有经验的关于重载方法的建议

我正在我的项目中的
Service
组件中使用
MediaPlayer
,该组件将在播放音乐时使用。我的音乐文件(.mp3)在apk的
res/raw
文件夹中。 要开始播放,我知道我必须准备MediaPlayer对象。因为android应用程序中的服务默认使用单进程和主线程,所以我不希望我的用户 当MediaPlayer自行准备时(想想原始文件夹中的媒体文件是否有较大的大小)。 然后我使用
prepareAsync
而不是
prepare
(同步)。因此,我不能使用:

mp = MediaPlayer.create(context, R.raw.myfile);
因为这已经在内部调用了
prepare()
,而不是
prepareAsync()
。 所以基本上我有两个选择(四选二):

使用其中一个后,我可以简单地使用:

mp.prepareAsync();

最后,我的问题是“包括这些不同的方法,哪一种是最好的选择?一种方法比另一种方法有什么好处吗?我遗漏了什么吗?”

调用
create
setDataSource
的各种方法没有任何真正的好处。静态的
create
方法除了调用
setDataSource
prepare
之外,没有什么作用。各种
setDataSource
方法在内部相互调用。最终,它们归结为两个可能的本机调用,一个使用描述远程URI的字符串,另一个使用本地文件描述符。自己创建文件描述符可能会有一点性能优势,但在上下文中不会明显


对于本地文件播放,正如您在代码中演示的那样,只需调用
prepare
(或静态
create
方法)一点也不坏。底层播放器在确定相关元数据和快速返回(无论文件大小)时应该没有问题。
prepareAsync
方法对于网络流更为有用,在网络流中,任何数量的情况都可能导致一些意外的延迟。如果您正在设计一个通用播放器,那么使用
prepareAsync
方法将是一个不错的选择,但如果您只是在玩原始资产,则不会有任何区别。提供的各种方法只是为了方便(请注意javadoc for
create
)。

我个人喜欢最后一种方法,因为它在代码中不使用字符串。我现在不知道这算不算什么“好处”。@Geobits,我知道在代码中避免常量字符串是一个很好的做法,但是
FileDescriptor
是android对本地文件的首选。谢谢你的评论。我建议你阅读我对已接受答案的评论。在阅读了你的答案后,我调查了问题并理解了你的意思。我看到了
private native void\u setDataSource
方法,并注意到
setDataSource(FileDescriptor fd,long offset,long length)
方法对于本地访问更为常见。我粗略地推断出用于本地的
FileDescriptor
s和用于远程(流)目的的
Uri
s。
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
mp.prepareAsync();