我的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);
这段代码正在运行但没有更新搜索栏,这里的问题是什么?
答案 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 /主线程上运行Handlernew 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);
}
});