我正在使用Seekbar对音乐播放器进行编程。使用带有Runnable的Handler对其进行管理。不知何故,它落后于我的UI。我怎样才能阻止这种滞后?
OnCreate:
mHandler = new Handler();
当我在播放一首歌时:
public static void updateProgressBar() {
mHandler.postDelayed(mUpdateTimeTask, 100);
}
My Runnable:
private static Runnable mUpdateTimeTask = new Runnable() {
public void run() {
try {
long totalDuration = songService.getTotalDuration();
int currentDuration = songService.getCurrentDuration();
// Displaying Total Duration time
player_time_length.setText(""+utils.milliSecondsToTimer(totalDuration));
// Displaying time completed playing
player_time_current.setText(""+utils.milliSecondsToTimer(currentDuration));
// Updating progress bar
int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
SB_song.setProgress(currentDuration);
// Running this thread after 100 milliseconds
mHandler.postDelayed(this, 100);
}catch(Exception e){}
}
};
如何在我的应用程序中阻止此问题?
答案 0 :(得分:2)
滞后是因为Runnable
正在执行UI Thread
。要减少或消除延迟,您必须减少Runnable
内的工作量。
您可以做的一件事就是从long totalDuration = songService.getTotalDuration();
删除Runnable
,而不是像我在音乐播放器中那样把它放在外面。
如果您包含用于将毫秒转换为人类可读时间的“utils”方法,我可以为此答案添加更多内容。
答案 1 :(得分:0)
我会说它因为它在UI线程上运行而滞后。但你必须使用UI元素,因此不可能使用另一个Thread ..我是对的吗?
答案 2 :(得分:0)
确保文本视图未设置为wrap_content。每次调用setText时都会触发布局传递。