
在阅读了“ Media Playback”和“ MediaPlayer”的androID文档之后,我仍然感到困惑,并且需要经验丰富的有关setDataSource重载方法的建议.
我在项目的Service组件中使用MediaPlayer,该组件在播放音乐时将是foregroundService.我的apk的res / raw文件夹中有我的音乐文件(.mp3).
要开始播放,我知道我必须准备MediaPlayer对象.由于androID应用程序中的服务默认情况下使用单个进程和主线程,因此我不希望用户获得ANR
而MediaPlayer会自行准备(请考虑一下原始文件夹中的媒体文件是否很大).
然后,我使用prepareAsync代替prepare(Sync).所以我不能使用:
mp = MediaPlayer.create(context, R.raw.myfile);因为这已经在内部调用prepare(),但没有在prepareAsync()上调用.
所以基本上我有两个选择(四个中的两个):
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();最后,我的问题浮出水面:“包括这些不同的方法,哪一种是最好的选择?一个比另一个有好处吗?我错过了什么吗?”
解决方法:
调用create或setDataSource的各种方式并没有任何真正的好处.静态创建方法除了调用setDataSource和prepare之外没有做更多的事情.各种setDataSource方法在内部相互调用.最终,它们归结为两个可能的本地调用,一个带有描述远程URI的字符串,另一个带有本地文件描述符.自己创建文件描述符可能会有很小的性能优势,但在上下文中将不明显.
对于本地文件回放,正如您在代码中所演示的那样,仅调用prepare(或静态create方法)根本不是一个坏习惯.无论文件的大小如何,底层播放器在确定相关元数据并快速返回时都应该没有问题. prepareAsync方法对于网络流更为有用,在任何情况下,网络流都可能导致某些意外的延迟.如果您正在设计一个通用播放器,那么使用prepareAsync方法是可行的方法,但是如果您只是在播放原始资产,那应该没有任何区别.提供的各种方法只是为了方便(请注意用于创建的javadoc).
总结以上是内存溢出为你收集整理的android-MediaPlayer setDataSource需要最佳实践建议全部内容,希望文章能够帮你解决android-MediaPlayer setDataSource需要最佳实践建议所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)