这是播放媒体时更新ProgressBar的正确方式吗?我想在MediaPlayer中会有一个回调,但是我找不到。
mediaPlayer.start();
final SeekBar progress = (SeekBar) dialog.findViewById(R.id.seekBar1);
progress.setMax(mediaPlayer.getDuration());
new CountDownTimer(mediaPlayer.getDuration(), 250) {
public void onTick(long millisUntilFinished) {
progress.setProgress(progress.getProgress() + 250);
}
public void onFinish() {}
}.start();诚挚的问候。
发布于 2012-04-04 04:39:51
看看,它有一个进度条。
如果合适,它们使用递归调用自身的处理程序。您可以将延迟设置为您希望更新进度条的频率。
请注意,用户可以显示或隐藏控制器,也可以拖动控制器,当然,视频也可以停止。这些是在另一次递归调用以更新条形图之前进行各种检查(!mDragging && mShowing && mVideoView.isPlaying())的原因。
protected Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
int pos;
switch (msg.what)
{
// ...
case SHOW_PROGRESS:
pos = setProgress();
if (!mDragging && mShowing && mVideoView.isPlaying())
{
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 1000 - (pos % 1000));
}
break;
// ...
}
}
};要启动它,请使用:
mHandler.sendEmptyMessage(SHOW_PROGRESS);它会自动停止,但您应该使用以下命令取消最后一个挂起的请求:
mHandler.removeMessages(SHOW_PROGRESS);发布于 2012-04-04 04:02:12
就我个人而言,我启动了一个线程,它每隔200ms左右检查一次getCurrentPosition(),直到onCompletion()事件被触发:
private class MediaObserver implements Runnable {
private AtomicBoolean stop = new AtomicBoolean(false);
public void stop() {
stop.set(true);
}
@Override
public void run() {
while (!stop.get()) {
progress.setProgress(mediaPlayer.getCurrentPosition());
Thread.sleep(200);
}
}
}
private MediaObserver observer = null;
public void runMedia() {
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener{
@Override
public void onCompletion(MediaPlayer mPlayer) {
observer.stop();
progress.setProgress(mPlayer.getCurrentPosition());
}
});
observer = new MediaObserver();
mediaPlayer.start();
new Thread(observer).start();
}发布于 2015-07-13 17:16:40
最有效的方法是使用JRaymond的答案和EventBus
private class MediaObserver implements Runnable {
private AtomicBoolean stop = new AtomicBoolean(false);
public void stop() {
stop.set(true);
}
@Override public void run() {
while (!stop.get()) {
try {
if (player.isPlaying())
sendMsgToUI(player.getCurrentPosition(),
player.getDuration());
} catch (Exception e){e.printStackTrace();}
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
private MediaObserver observer = null;
public void runMedia() {
observer = new MediaObserver();
new Thread(observer).start();
}
//handles all the background threads things for you
private void sendMsgToUI(int position) {
ChangingEvent event = new ChangingEvent(position);
EventBus.getDefault().post(event);
}ChangingEvent类看起来像这样:
public class ChangingEvent {
private int position;
public ChangingEvent(int position) {
this.position= position;
}
public int getPosition() {
return position;
}
}在你的活动或片段中,你所要做的就是
class YouClass extends Activity {
private EventBus eventBus = EventBus.getDefault();
}
@Override protected void onCreate(Bundle savedInstanceState) {
//your code
eventBus.register(this);
}
//eventbus that updates UI
public void onEventMainThread(ChangingEvent event) {
//seekbar or any other ui element
seekBar.setProgress(event.getPosition());
}https://stackoverflow.com/questions/10000400
复制相似问题