need help to interpret Google's camcorder app-update timer
<p>The function below is part of the code for Google's Camera app.
It is supposed to update a text view that displays dynamically the time elapsed since start of recording. But this function does not have a loop so how does it do it? Please help.</p>

<p>private static final int UPDATE_RECORD_TIME = 5;</p>

<pre><code>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;
            }
        }
    }  
</code></pre>

<p>int seconds = intent.getIntExtra(MediaStore.EXTRA_DURATION_LIMIT, 0); mMaxVideoDurationInMs = 1000 * seconds;</p>

<pre><code>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 
        &amp;&amp; delta &gt;= 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() &lt; 2) { 
    secondsString = "0" + secondsString; 
} 
String minutesString = Long.toString(remainderMinutes); 
if (minutesString.length() &lt; 2) { 
    minutesString = "0" + minutesString; 
} 
String text = minutesString + ":" + secondsString; 
if (hours &gt; 0) { 
    String hoursString = Long.toString(hours); 
    if (hoursString.length() &lt; 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); 
} 
</code></pre>
