MediaStream
方法prepareAsync()
的文档说:
以异步方式准备播放器以进行播放。设置完成后 数据源和显示表面,你需要调用prepare() 或prepareAsync()。 对于流,您应该调用prepareAsync(), 它会立即返回,而不是阻塞,直到有足够的数据 已被缓冲。
如果我们使用prepare()
播放流,那么错误会出错我一直在使用prepare()
,我从来没有遇到任何麻烦。
相反,在我自己的情况下,当我使用'prepareAsync()'时,流不会启动。当我使用'prepare()'时,流在缓冲期(1s-2s)之后开始并且播放良好。为什么这会发生异步方法?异步的表单是否与prepare()
的表单相同?
mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(STREAM_URL);
mPlayer.prepareAsync();
mPlayer.start();
答案 0 :(得分:3)
prepare()
的问题在于它会阻止UI
线程。如果准备媒体花费的时间太长,您的应用将会因ANR
错误而被杀死。
事件然后,阻止UI
线程1到2秒并不是很酷。如果你正在点击一个网络服务器,你肯定迟早会被杀死。
要让prepareAsync
生效,您必须致电MediaPlayer.setOnPreparedListener
,然后在处理程序中调用MediaPlayer.start()
。
答案 1 :(得分:1)
在UI线程中执行复杂操作是一种不好的做法。它可以阻止您的用户界面很长时间,Android可能会杀死您的应用。 在这种情况下,由于解码和获取数据,prepare()方法可能会花费大量时间。
您应该在收听OnPrepared事件时调用prepareAsync()方法。当事件被触发时,您应该通知您的UI并启动播放器。
mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(STREAM_URL);
mplayer.setOnPreparedListener(/*your listener here*/)
mPlayer.prepareAsync();