Android写一个很简单的mediaplay播放:
在构造函数中创建对象,设置监听
<span style="white-space:pre"> </span>mediaPlayer = new MediaPlayer();
<span style="white-space:pre"> </span>mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
<span style="white-space:pre"> </span>mediaPlayer.setOnBufferingUpdateListener(this);
<span style="white-space:pre"> </span>mediaPlayer.setOnPreparedListener(this);
<span style="white-space:pre"> </span>mediaPlayer.setOnCompletionListener(this);
<span style="white-space:pre"> </span>mediaPlayer.reset();
点击listview的item后调用播放:
<span style="white-space:pre"> </span>mediaPlayer.setDataSource(videoUrl);
<span style="white-space:pre"> </span>mediaPlayer.prepareAsync();// prepare之后自动播放
在设置监听
setOnPreparedListener 函数接口中实现
mediaPlayer.start();
在代码逻辑上看着貌似没有任何问题。
在真正试用中发现,当网络状况不好,播放一首歌曲永远调用不了setOnPreparedListener函数一直在准备播放中,当网络好了就可以播放了,但网络一直不好的情况下,只能等下去,因为切下一首他会告诉你是无效操作,真个操作中断不了。
在Android源码4.4.4上通过framework层代码分析,问题一直追踪到url_request.cc文件中。
第二次reset是调用这个方法,被卡死,没有返回,
上面的步骤去调用下面的函数,取回包头,判断文件类型解码。
在解码类型文件中调用这个readat,去读取数据。并等待锁返回
如果数据不会来,循环,回来再解锁。
在这儿循环在判断,
在访问网络的文件中
只有在网络有数据和失去连接后。这个锁才会被释放。
访问return没有调用上层onReadCompleted,时会出现问题。每次在return哪儿加调用,正常播放成为了概率事件。(网络特别好的情况下有几次能播)
整个过程交给了,
这个函数被底层net::URLRequest
调用OnReadCompleted函数被底层调用。如果不调用,上层就被while锁住。
被锁的问题是在搞不定。Android5.1改变了访问网络的方式,使用mediahttp,最终调用api成的mediaplayhttpconnect去访问网络。
这个地方还可以怎么改一下???????????