所遇到的问题 1、音频播放完成后 播放完成监听回调

 public void onCompletion(MediaPlayer mp) {}

方法走了两次。

2、点击再次重新播放时,报

IllegalStateException

错误。

3、销毁activity时依然报2中的错误。

 

首先贴出一个工具类的部分代码

//单例public static VoiceMediaPlayer getInstance(){        if(instance==null){            synchronized (VoiceMediaPlayer.class){                if(instance==null){                    instance=new VoiceMediaPlayer();                }            }        }        return instance;    }//初始化 public void initMediaPlayer(){        if(mediaPlayer==null){            mediaPlayer=new MediaPlayer();        }        mediaPlayer.setVolume(1.0f,1.0f);        mediaPlayer.setLooping(false);    }//停止播放 public void stopMediaPlayer(){        mediaPlayer.stop();        mediaPlayer.reset();    }//播放 public void play(final String path, final MediaPlayer.OnCompletionListener listener, final MediaPlayer.OnPreparedListener preparedListener){        try{            //mediaPlayer.reset();            mediaPlayer.setDataSource(path);            mediaPlayer.prepareAsync();            mediaPlayer.setOnCompletionListener(listener);            mediaPlayer.setOnPreparedListener(preparedListener);        }catch (IOException e){            e.printStackTrace();        }    }//销毁 public void destroyMediaPlayer(){        try{            if(mediaPlayer!=null){                mediaPlayer.stop();                //mediaPlayer.reset();                mediaPlayer.release();                mediaPlayer=null;            }        }catch (Exception e){            e.printStackTrace();        }    }

 

首先第一个问题,播放完成怎么会调用两次回调方法呢?

那是我在回调方法onComletion中调用了停止播放的方法,上面代码可以看到里面调用了mediaPlayer.reset方法。

这个方法的的作用是重置MediaPlayer对象为刚刚创建的状态(我没有在源码中找到调用会触发播放完成的回调方法),

我们只能从字面意思上来分析,刚刚播放完成,就调用了reset方法,重置了刚刚的状态也就是播放完成的状态,从而再次

调用了播放完成的状态(一定要重点理解是刚刚,这里我不确定我的理解是否正确,若有错误,请指出加以改正,目前从

实践上证明是这样子的)。

第二个问题,播放完成点击重新播放为何会报错呢?原因还是我在第一问题的解决基础上,播放完成我没有再调用停止播放方法

,而在此调用播放走play播放的方法时候,mediaPlayer没有重置状态,还是这个reset()方法,总是它,于是需要在上述play

方法里面准备异步加载前调用一下reset方法。

 

第三个问题,其实还是这个reset方法,每次都是它,好烦它。

当activity销毁时,需要先把mediaPlayer释放掉,mediaplayer.release释放之前仍需要先重置mediaplayer的状态,调用reset方法。

 

后两个个问题都是在通过源码中得到解释,很简单,就不再赘述源码。

以上问题都是自己开发的时候不注意,用第三方的用的多,用原生自己写的时候就不那么严禁导致的,以此记录勉励自己,加油!

下一篇 音量焦点问题。

更多相关文章

  1. Android(安卓)判断当前线程是否是主线程的两种方法
  2. 我的Android进阶之旅------>Android中高低API版本兼容使用@Targe
  3. ContentProvider的工作过程
  4. SystemServer(一):恢复出厂设置后wifi、数据流量、gps设置关闭
  5. Android(安卓)ListView列表视图的使用方法
  6. Android(安卓)快速调用系统自带程序发送彩信实现
  7. 记录的Android开发过程中遇到的问题。
  8. RecyclerView 局部刷新、删除错乱
  9. Android中EditText控件的几种使用方法

随机推荐

  1. android 自定义进度条颜色
  2. Activity的启动流程(基于Android(安卓)10
  3. Android(安卓)系统启动过程详解
  4. 理解 Android(安卓)进程启动之全过程
  5. 利用HTML5开发Android
  6. Android(安卓)-- Looper.prepare()和Loop
  7. 如何实现Android(安卓)APP静默安装
  8. Android之UI学习篇八:使用GridView实现九
  9. Android监听呼出电话
  10. Android(安卓)实用工具Hierarchy Viewer