Mediaplayer中通过create函数获取资源时PreareAsync问题

作者:郭涵川 


      Mediaplayer是Android中最重要,同时也是最复杂的一个多媒体播放器,在Android应用程序的开发过程中,Mediaplayer是最常被使用到的技术之一。本文主要说明Mediaplayer在通过create方法获得资源时的问题阐述和解决方法。


       使用Mediaplayer时,大家最常使用的获得资源的方法一般有两种,一种是通过setDataSource()方法,在该方法中通过添加文件路径来获得系统资源,相信大家对这种方式更加熟悉,但是本人在实现这种方法时总是会出现异常,无法找到资源。经过很多次的尝试,并且结合在网上搜索的各种解决方案,最后还是没能解决这个问题。所以,本人选择了一个不太好的方式:逃避(拍砖请轻拍)。因为我相信Mediaplayer会提供其他获得资源的方式。


       经过简单的搜索,很容易的就发现了在Mediaplayer中提供了create()方法,在该方法中,我们只需将目标文件放在项目资源文件的某个目录下,就可以轻松的找到。 (当然,这里也是可以使用URL路径寻找目标文件的,不过本人比较懒,所以没有尝试这种方法。)


  Mediaplayer中通过create函数获取资源时PreareAsync问题_第1张图片



然后,我就很高兴的调用prepare()和start()方法,运行了模拟器,聆听美妙的音乐。不过就在我以为万事OK的时候,在Log里面发现了让我无奈的prepareAsync异常:





顾名思义,这是一个同步异常,所以经过简单的思考,以及在网上搜索结果,容易得到一种简单的解决方法:在使用之前先判断一下是否已经有对象在运行,如果有先将其停止,然后重新运行。


Mediaplayer中通过create函数获取资源时PreareAsync问题_第2张图片


这种方法已经能将这个问题解决,不过我还是觉得心有不甘,为什么在运行的时候会出现这种问题呢?显然是在prepare()方法之前,就已经调用过了prepare()方法才会有这种问题,但是在prepare()前面只有create()一个方法涉及到了Mediaplayer对象。(之前看过的setDataSource()源码,对我产生了误导作用。导致我没有直接去看create()方法的源码,本人以为他们的实现方法应该是一致的。)

         也是机缘巧合,无意中,我看了一下create()方法的源码,恍然大悟。

Mediaplayer中通过create函数获取资源时PreareAsync问题_第3张图片


       请注意红色标出的部分,我相信大家应该都会明白了,之所以会产生异常,是因为在create()方法中,已经对Mediaplayer对象调用过了prepare()方法,所以再次调用就会发生异常。


       那么就会产生第二种解决方案,就是直接把那句折磨人的Mediaplayer.prepare()方法去掉!真是大快人心!现在我们就可以安心的聆听音乐无需烦恼、无需忧愁了。



你可能感兴趣的:(android,url,音乐)