我正在尝试制作音乐流媒体应用。 到目前为止,它的工作正常。 我正在使用
MediaPlayer.create(thisContext, Uri.parse(PATH_TO_STREAM));
准备无限流的便捷方法(24x7 mp3流)。 它在这个调用中挂起了几秒钟,我已经整齐地插入到我的startPlaying()方法中。 该按钮没有显示它被点击直到流开始播放之后,所以首先用户想知道他们是否点击了按钮或错过了。 所以我想更新按钮旁边的TextView标签,上面写着“等待......”或“缓冲”等,然后在流启动后清除它,以便用户知道按下按钮确定。 即使我在调试中逐步执行此操作,标签也不会更新,直到onClick完成。我可以注释掉清除标签文本的最后一行,并且可以看到它设置为“缓冲......”确定。但只有在它退出onClick之后。这是使用媒体播放器create()方法的限制吗?
final Button startbutton = (Button) findViewById(R.id.Button01);
this.tvBuffering = (TextView) findViewById(R.id.tvBuffering);
startbutton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
tvBuffering.setText("Buffering...");
//do something like invalidate() here??
startPlaying(); //blocks here for a few seconds to buffer then plays.
tvBuffering.setText(" "); //clear the text since it's playing by now.
}
});
答案 0 :(得分:1)
故意在UI中包含这种延迟并不是一个好主意,因为这会阻止用户在几秒钟内尝试做的任何事情。我假设您的startPlaying()
包含对prepare()
的调用,以及start()
。从无法立即获得的源(例如流)中获取数据时,您应该使用prepareAsync()
代替,这将开始准备并立即返回而不是阻止,直到准备工作完成。
您可以将回调附加到MediaPlayer
,然后在准备完成后通过MediaPlayer.OnPreparedListener
这是一个简单的例子。请注意,只要您将prepare()
方法中的startPlaying()
更改为prepareAsync()
并从start()
移除startPlaying()
来电,您的OnClickListener就可以保持不变。
startbutton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
tvBuffering.setText("Buffering...");
startPlaying(); //which should call prepareAsync() instead of prepare()
//and have no call to start()
}
});
mYourMediaPlayer.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
start();
tvBuffering.setText(" ");
}
});