需要帮助来解释谷歌的摄像机应用更新计时器

时间:2010-07-12 10:05:03

标签: android

以下功能是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); 
} 

1 个答案:

答案 0 :(得分:0)

mHandler.sendEmptyMessageDelayed(UPDATE_RECORD_TIME, next_update_delay); 

此行在next_update_delay时间后发送一个事件。我想,某处有mHandler声明和处理UPDATE_RECORD_TIME事件的代码。我打赌它会调用updateRecordingTime,然后在一段时间后发送消息。

这是循环的异步版本。该方法完成其工作,然后安排自己在一段时间后执行。

但是,必须首先调用updateRecordingTimesendMessageDelayed之外的updateRecordingTime方法,以便最初启动循环。