首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaPlayer,ProgressBar

MediaPlayer,ProgressBar
EN

Stack Overflow用户
提问于 2012-04-04 03:56:37
回答 3查看 29.1K关注 0票数 11

这是播放媒体时更新ProgressBar的正确方式吗?我想在MediaPlayer中会有一个回调,但是我找不到。

代码语言:javascript
复制
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();

诚挚的问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-04 04:39:51

看看,它有一个进度条。

如果合适,它们使用递归调用自身的处理程序。您可以将延迟设置为您希望更新进度条的频率。

请注意,用户可以显示或隐藏控制器,也可以拖动控制器,当然,视频也可以停止。这些是在另一次递归调用以更新条形图之前进行各种检查(!mDragging && mShowing && mVideoView.isPlaying())的原因。

代码语言:javascript
复制
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;

             // ...
        }
    }
};

要启动它,请使用:

代码语言:javascript
复制
mHandler.sendEmptyMessage(SHOW_PROGRESS);

它会自动停止,但您应该使用以下命令取消最后一个挂起的请求:

代码语言:javascript
复制
mHandler.removeMessages(SHOW_PROGRESS);
票数 11
EN

Stack Overflow用户

发布于 2012-04-04 04:02:12

就我个人而言,我启动了一个线程,它每隔200ms左右检查一次getCurrentPosition(),直到onCompletion()事件被触发:

代码语言:javascript
复制
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();
}
票数 23
EN

Stack Overflow用户

发布于 2015-07-13 17:16:40

最有效的方法是使用JRaymond的答案和EventBus

代码语言:javascript
复制
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类看起来像这样:

代码语言:javascript
复制
public class ChangingEvent {
  private int position;

  public ChangingEvent(int position) {
      this.position= position;
  }

  public int getPosition() {
      return position;
  }
}

在你的活动或片段中,你所要做的就是

代码语言:javascript
复制
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());
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10000400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档