方案一:
用发延时消息实现( 缺点:当cpu使用较高时,计时不准确)
补充知识:TimerTask的run内直接setProgress也不会报错,但是其他的UI设置是无效的。原因setProgress底层有判断当前线程是否为UI线程,如果不是ProgressBar会自动new一个刷新的线程。
用发延时消息实现( 缺点:当cpu使用较高时,计时不准确)
handler.sendMessageDelayed(message, 1000);
private void startPlay() {
。。。
pbProgress.setMax(totalTime);
currentTime = 0;
pbProgress.setProgress(currentTime);
countHandler.sendEmptyMessageDelayed(1, 1000);
}
private Handler countHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
currentTime++;
if (currentTime <= totalTime) {
pbProgress.setProgress(currentTime);
countHandler.sendEmptyMessageDelayed(1, 1000);
}
break;
}
}
};
方案二:
用Timer和TimerTask实现
mTimer.schedule(mTimerTask, 0, 1000);
public void setTimer() {
stopTimer();
if (mTimer == null) {
mTimer = new Timer();
}
if (mTimerTask == null) {
mTimerTask = new TimerTask() {
@Override
public void run() {
currentTime++;
countHandler.sendEmptyMessage(1);
}
};
}
// 每隔1秒更新一下进度
if (mTimer != null && mTimerTask != null)
mTimer.schedule(mTimerTask, 0, 1000);
}
protected void stopTimer() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
if (mTimerTask != null) {
mTimerTask.cancel();
mTimerTask = null;
}
}
补充知识:TimerTask的run内直接setProgress也不会报错,但是其他的UI设置是无效的。原因setProgress底层有判断当前线程是否为UI线程,如果不是ProgressBar会自动new一个刷新的线程。
ProgressBar.java内
private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
if (mUiThreadId == Thread.currentThread().getId()) {
doRefreshProgress(id, progress, fromUser, true);
} else {
if (mRefreshProgressRunnable == null) {
mRefreshProgressRunnable = new RefreshProgressRunnable();
}
final RefreshData rd = RefreshData.obtain(id, progress, fromUser);
mRefreshData.add(rd);
if (mAttached && !mRefreshIsPosted) {
post(mRefreshProgressRunnable);
mRefreshIsPosted = true;
}
}
}