SeekBar不会更新Runnable

时间:2017-08-22 11:52:10

标签: android multithreading

我的SeekBar没有更新,我已经确认我的runnable正在运行,但是搜索栏不会更新。

这是我的代码:

        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if(mMediaPlayer != null && isSongPlaying) {
                    Log.i("Runnable", "I am Getting Called!");
                    int duration = mMediaPlayer.getCurrentPosition() / 1000;
                    mSeekBar.setProgress(duration);

                }
                mHandler.postDelayed(this, 1000);
            }
        }, 1000);

这段代码正在运行但没有更新搜索栏,这里的问题是什么?

Log Cat

3 个答案:

答案 0 :(得分:1)

首先要更新您的SeekBar,您需要获取当前录制的最长持续时间并将其设置为搜索栏。

mSeekBar.setMax(mFileDuration);

其次,您需要从UI线程更新SeekBar:

YourActivity.this.runOnUiThread(new Runnable() {
 @Override
 public void run() {
  if (mMediaPlayer != null && isSongPlaying) {
   Log.i("Runnable", "I am Getting Called!");
   int duration = mMediaPlayer.getCurrentPosition() / 1000;
   mSeekBar.setProgress(duration);

  }
  mHandler.postDelayed(this, 1000);
 }
});

答案 1 :(得分:0)

您无法在与线程不同的线程中更新UI。调用处理程序会创建一个新线程,这意味着您的日志输出可见,但更新视图(搜索栏)不是。

对于这种情况我们使用AsyncTask,使用RXJava更简单,或者使用

在Ui /主线程上运行Handler
new Handler(Looper.getMainLooper());

或者您可以将其直接运行到主线程中,如:

MainActivity.this.runOnUiThread(new Runnable() {

@Override
public void run() {
   if(mMediaPlayer != null && isSongPlaying) {
                Log.i("Runnable", "I am Getting Called!");
                int duration = mMediaPlayer.getCurrentPosition() / 1000;
                mSeekBar.setProgress(duration);

    }
    mHandler.postDelayed(this, 1000);
}
});

答案 2 :(得分:0)

尝试从UI线程更新您的搜索栏,如下面的代码

private Handler mHandler = new Handler();
 //Make sure you update Seekbar on UI thread
 YourActivity.this.runOnUiThread(new Runnable() {   

 @Override
    public void run() {
        if(mMediaPlayer != null && isSongPlaying) {
                Log.i("Runnable", "I am Getting Called!");
                int duration = mMediaPlayer.getCurrentPosition() / 1000;
                mSeekBar.setProgress(duration);

            }
        mHandler.postDelayed(this, 1000);
    }
});