MediaPlayer setDataSource需要最佳实践build议

在阅读“ 媒体播放 ”和“ MediaPlayer ”android文档后,我仍然感到困惑,需要有关setDataSource重载方法的有经验的build议。

我在播放音乐时将在前台 Service中的Project中的Service组件中使用MediaPlayer 。 我有我的音乐文件(.mp3)在res/raw我的apk文件夹。 要开始播放,我知道我必须准备MediaPlayer对象。 由于Android应用程序中的服务默认情况下使用单进程和主线程,因此我不希望我的用户在MediaPlayer准备自己的时候获得ANR (如果原始文件夹中的媒体文件具有较大的大小)。 然后我使用prepareAsync代替prepare (Sync)。 所以我不能使用:

 mp = MediaPlayer.create(context, R.raw.myfile); 

因为这已经在内部调用prepare()而不是prepareAsync() 。 所以基本上我有两个select(从四个两个):

 Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile); mp.setDataSource(context, myUri); 

要么

 AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile); mp.setDataSource(fd.getFileDescriptor()); afd.close(); 

使用其中之一后我可以简单的使用:

 mp.prepareAsync(); 

最后,我的问题出现了:“包括这些不同的方法,哪一个是最好的select?是否有任何好处?我错过了什么?

Solutions Collecting From Web of "MediaPlayer setDataSource需要最佳实践build议"

调用createsetDataSource的各种方法没有任何实际的好处。 静态create方法不仅仅是调用setDataSourceprepare 。 各种setDataSource方法在内部互相调用。 最终他们归结为两个可能的本地调用,一个用描述远程URI的string,另一个用本地文件描述符。 自己创build文件描述符可能会有一个非常小的性能优势,但在上下文中并不明显。

对于本地文件播放,就像你在代码中演示的那样,简单地调用prepare (或静态create方法)根本不是一个坏习惯。 底层的播放器应该没有问题确定相关的元数据,并快速返回,无论文件的大小。 prepareAsync方法对于networkingstream更加有用,任何数量的情况都可能导致一些意想不到的延迟。 如果你正在devise一个通用的玩家,那么使用prepareAsync方法将是一条prepareAsync的路线,但是如果你只是在玩原始资产,那么它就不会有什么区别。 提供的各种方法只是一个方便的事情(注意create javadoc)。