¿Cuál es la forma recomendada de actualizar la interfaz de usuario de Android desde un subproceso de fondo continuo?

He leído lo suficientemente bien sobre el tema para ponerme bien y completamente confundido. Estoy haciendo una aplicación de seguimiento de entrenamiento como RunKeeper, que rastrea cuánto tiempo y hasta qué punto ha estado corriendo el usuario. Estoy en el proceso de programar la interfaz principal de este "entrenamiento" que muestra un diseño similar a un cronómetro que incluye tanto un temporizador que muestra la hora que se actualiza cada segundo, como un contador que muestra qué tan lejos está corriendo.

Mi problema es actualizar la interfaz. Tengo una clase de cronómetro que realiza un seguimiento de la hora y calculo la distancia en función de las ubicaciones de los gps, pero no puedo encontrar la manera recomendada de ejecutar una secuencia continua en segundo plano que actualice la interfaz de usuario en una tasa de tiempo fija .

Por lo que he podido decir, debería implementar la interfaz Handler.Callback en la clase de actividad o tener un objeto Callback separado junto con un Thread, pero no sé cómo obtener todo para trabajar juntos. Necesito actualizar el tiempo mostrado que obtengo de mi clase de cronómetro (cálculo simple de tiempo de inicio / parada, nada relacionado con el hilo) y la distancia calculada en función de las ubicaciones recibidas en onLocationChanged ().

Aquí hay una versión simplificada de mi código de actividad:

public class WorkoutActivity extends Activity implements OnClickListener, LocationListener
{
    private LocationManager locManager;
    private boolean workoutStarted = false;

    // The TextViews to update
    private TextView timeLabel;
    private TextView distanceLabel;

    private Stopwatch stopwatch;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        /*
            ... Interface initialisation
        */
        stopwatch = new Stopwatch();
    }

    private void startWorkout() {/* ...*/}
    private void stopWorkout()  {/* ...*/}
    private void pauseWorkout() {/* ...*/}
    private void resumeWorkout(){/* ...*/}
    public void onClick(View v) {/* ...*/}
    public void onLocationChanged(Location location){/* ...*/}
}

De acuerdo con la mayoría de las respuestas que he leído aquí, debería usar un objeto Handler que extienda el método de manejo de mensajes, pero en la actualidad (al menos de acuerdo con la advertencia en Lint), debe hacer que dichos objetos sean estáticos para evitar pérdidas de memoria. Sin embargo, eso hace que sea un poco extraño acceder y cambiar directamente los otros objetos privados en la clase de actividad desde dentro del Controlador. Supongo que podría resolver esto haciendo los objetos que necesita para afectar los parámetros en un controlador de extensión de clase, pero no sé, se siente como un "hack" (clase anidada dentro de WorkoutActivity):

static class TimeHandler extends Handler
{
    static final int MSG_START_TIMER = 1;
    static final int MSG_UPDATE_TIMER = 2;
    static final int MSG_STOP_TIMER = 3;

    private static final int REFRESH_RATE = 1000;

    private Stopwatch stopwatch;
    private TextView timeLabel;

    public TimeHandler(Stopwatch stopwatch, TextView label)
    {
        this.stopwatch = stopwatch;
        this.timeLabel = label;
    }

    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);

        switch(msg.what)
        {
            case MSG_START_TIMER:
                stopwatch.start();
                this.sendEmptyMessage(MSG_UPDATE_TIMER);
                break;
            case MSG_UPDATE_TIMER:
                timeLabel.setText(stopwatch.getElapsedTimeString());
                this.sendEmptyMessageDelayed(MSG_UPDATE_TIMER, REFRESH_RATE);
                break;
            case MSG_STOP_TIMER:
                this.removeMessages(MSG_UPDATE_TIMER);
                stopwatch.stop();
                timeLabel.setText(stopwatch.getElapsedTimeString());
                break;
        }           
    }

Entonces, ¿podría alguien explicar la forma "estándar" de actualizar la interfaz de usuario desde un hilo de fondo continuo? Ah, y perdón por la larga pregunta, solo quería ser cuidadoso.

Respuestas a la pregunta(2)

Su respuesta a la pregunta