菜鸟遇到的一点小问题,和大家分享~
最近在做音乐播放器,需要在线播放音乐,需要针对播放过程中的网络异常做处理(网速较慢、加载超时、网络连接断开),以提高音乐播放的用户体验。很多内容都是从网上google学会的,一些搜不到的内容自己摸索的结果在这里和大家交流一下~
在线播放音乐的代码如下:
mp.reset(); mp.setDataSource(url); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepare();
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Toast.makeText(getApplicationContext(), "播放错误!", Toast.LENGTH_SHORT).show(); return true; } });mp.start();一开始的代码是以上这样的。查看官方的文档给mediaplayer对象设置了一个OnErrorListener监听器实现了onError方法,在这个方法中做错误处理。然而经过试验,这样子并不能捕捉到网络异常的情况,比如音乐加载了一半手动断开网络,当播放完加载的内容后,此时并不会触发onError方法,而是停在未加载的位置一直等待加载。上网搜了很多文章都没有找到相应的解决方法,最后只好自己试试,最后解决办法如下:
mp.reset(); mp.setDataSource(url); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepareAsync();mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mBufferProgress = 0; mp.start(); } });mp.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) {Toast.makeText(getApplicationContext(), "播放错误!", Toast.LENGTH_SHORT).show(); return true; } });如上,只需把mp.prepare换成mp.prepareAsync();并在OnPreparedListener()中启动音乐播放就可以成功监听播放过程中的网络异常情况。官方看了一下prepareAsync()是异步加载的意思,具体的细节我也没看完,下一步研究研究~public void prepare()Added in API level 1Prepares the player for playback, synchronously. After setting the datasource and the display surface, you need to either call prepare() or prepareAsync(). For files, it is OK to call prepare(), which blocks until MediaPlayer is ready for playback.
public void prepareAsync ()
Added in API level 1大意是 prepare()需要准备足够的数据才开始播放, prepareAsync马上播放。Prepares the player for playback, asynchronously. After setting the datasource and the display surface, you need to either call prepare() or prepareAsync(). For streams, you should call prepareAsync(), which returns immediately, rather than blocking until enough data has been buffered.