以下功能是Google相机应用程序代码的一部分。 它应该更新一个文本视图,动态显示自开始记录以来经过的时间。但是这个函数没有循环所以它是如何做到的呢?请帮忙。
private static final int UPDATE_RECORD_TIME = 5;
private final Handler mHandler = new MainHandler();
private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_RECORD_TIME: {
updateRecordingTime();
break;
}
default:
Log.v(TAG, "Unhandled message: " + msg.what);
break;
}
}
}
int seconds = intent.getIntExtra(MediaStore.EXTRA_DURATION_LIMIT,0); mMaxVideoDurationInMs = 1000 *秒;
mMediaRecorder.setMaxDuration(mMaxVideoDurationInMs);
//this function is to update the recording time
private void updateRecordingTime() {
if (!mMediaRecorderRecording) { return; }
long now = SystemClock.uptimeMillis();
long delta = now - mRecordingStartTime;
// Starting a minute before reaching the max duration
// limit, we'll countdown the remaining time instead.
boolean countdownRemainingTime = (mMaxVideoDurationInMs != 0
&& delta >= mMaxVideoDurationInMs - 60000);
long next_update_delay = 1000 - (delta % 1000);
long seconds;
if (countdownRemainingTime) {
delta = Math.max(0, mMaxVideoDurationInMs - delta);
seconds = (delta + 999) / 1000;
} else {
seconds = delta / 1000; // round to nearest
}
long minutes = seconds / 60;
long hours = minutes / 60;
long remainderMinutes = minutes - (hours * 60);
long remainderSeconds = seconds - (minutes * 60);
String secondsString = Long.toString(remainderSeconds);
if (secondsString.length() < 2) {
secondsString = "0" + secondsString;
}
String minutesString = Long.toString(remainderMinutes);
if (minutesString.length() < 2) {
minutesString = "0" + minutesString;
}
String text = minutesString + ":" + secondsString;
if (hours > 0) {
String hoursString = Long.toString(hours);
if (hoursString.length() < 2) {
hoursString = "0" + hoursString;
}
text = hoursString + ":" + text;
}
mRecordingTimeView.setText(text);
if (mRecordingTimeCountsDown != countdownRemainingTime) {
// Avoid setting the color on every update, do it only
// when it needs changing.
mRecordingTimeCountsDown = countdownRemainingTime;
int color = getResources().getColor(countdownRemainingTime
? R.color.recording_time_remaining_text
: R.color.recording_time_elapsed_text);
mRecordingTimeView.setTextColor(color);
}
// Work around a limitation of the T-Mobile G1: The T-Mobile
// hardware blitter can't pixel-accurately scale and clip at the
// same time, and the SurfaceFlinger doesn't attempt to work around
// this limitation. In order to avoid visual corruption we must
// manually refresh the entire surface view when changing any
// overlapping view's contents.
mVideoPreview.invalidate();
mHandler.sendEmptyMessageDelayed(
UPDATE_RECORD_TIME, next_update_delay);
}
答案 0 :(得分:0)
mHandler.sendEmptyMessageDelayed(UPDATE_RECORD_TIME, next_update_delay);
此行在next_update_delay
时间后发送一个事件。我想,某处有mHandler
声明和处理UPDATE_RECORD_TIME
事件的代码。我打赌它会调用updateRecordingTime
,然后在一段时间后发送消息。
这是循环的异步版本。该方法完成其工作,然后安排自己在一段时间后执行。
但是,必须首先调用updateRecordingTime
或sendMessageDelayed
之外的updateRecordingTime
方法,以便最初启动循环。