基本上我正在使用搜索栏向用户显示音频播放的方式,我的视觉更新显示在Thread
中,如下所示:
@Override
public void run() {
while(mUpdating) {
if(mSeekBar != null) {
mSeekBar.setProgress(mAudioPlaybackManager.getCurrentPosition());
}
//Other stuff is updating
}
}
因此,例如,如果用户播放长度为2500毫秒的音频,则此SeekBar
最大值将为2500,并且每隔ms将更新
同样的代码在runOnUiThread
中的工作速度要慢得多,所以我猜测什么时候会改变进度postInvalidate
被称为
所以基本上每个ms,都应该改变搜索条的值。我想这就是问题所在。在我的设备Samsung J7
上,它工作顺利,但在Samsung Galaxy S5
它只是停止和跳跃,就像我将此代码放在runOnUIThread
中一样,它会非常慢。
我该怎么做才能让它更顺畅?我可以用另一个View
用于此目的吗?
当前SeekBar
正在做的事情:
基本上在while(updating)
当用户更改SeekBar
音频的位置时,从该点开始。
答案 0 :(得分:0)
线程是工作线程,而不是UI的线程,你正在操作线程中的UI组件,从而阻止了UI的线程。
如果您想更新搜索栏,请在UI的主题中更新它。可以使用UI的线程处理程序完成。
例如
private Runnable updateSeekBarTime = new Runnable() {
public void run() {
//get current position
timeElapsed = mediaPlayer.getCurrentPosition();
//set seekbar progress
seekbar.setProgress((int) timeElapsed);
//repeat yourself again in 100 miliseconds
durationHandler.postDelayed(this, 100);
}
};
执行
public void play(View view) {
mediaPlayer.start();
while(mUpdating) {
if(mSeekBar != null) {
// post the Runnable (updateSeekBarTime)
durationHandler.postDelayed(updateSeekBarTime, 100);
}
}
}
从用户的角度来看,也不能简单地每毫秒更新一次组件,不会注意到暂停。