2011-03-20 13 views
6

Básicamente, estoy tratando de ejecutar un contador de segundos y un contador de niveles. Por cada 10 segundos quiero nivelar ++.
Pero eso aún no está implementado, hasta ahora solo estoy tratando de obtener los segundos para mostrar, pero estoy recibiendo excepciones de tiempo de ejecución y un bloqueo.
googlear veo que es porque estoy tratando de actualizar la interfaz de usuario de mi hilo y eso no está permitido. Así que supongo que voy a necesitar asyncTask, pero no tengo idea de cómo hacerlo con mi pequeño y sencillo programa. Por favor, ayuda o dame algunas alternativas ...Android, creando un hilo simple que actualizará mi contador de segundos

package com.ryan1; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class main extends Activity { 

int level = 1; 
int seconds_running=0; 

TextView the_seconds; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    the_seconds = (TextView) findViewById(R.id.textview_seconds); 



    Thread thread1 = new Thread(){ 
     public void run(){ 
      try { 
       sleep(1000); Log.d("RYAN", " RYAN "); 

       updated_secs(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.d("RYAN", " "+e); 
      } 
     } 
    }; 
    thread1.start(); 
} 

public void updated_secs(){ 
    seconds_running++; 
    the_seconds.setText(" "+seconds_running); 
} 
} 

Respuesta

6

Cree un controlador en su subproceso de interfaz de usuario, luego en el hilo de trabajo envíe un mensaje al controlador (Handler.sendMessage (...)).

El mensaje será procesado en el hilo de interfaz de usuario, para que pueda actualizar el widget de texto correctamente. De esta manera:

private Handler myUIHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     if (msg.what == some_id_you_created) 
     { 
      //Update UI here... 
     } 
    } 
}; 

Then in your thread, to send a message to the handler you do this: 

Message theMessage = myHandler.obtainMessage(some_id_you_created); 
myUIHandler.sendMessage(theMessage);//Sends the message to the UI handler. 
+0

¡Hola! Compartimos el mismo nombre :) ¿Me puede dar un código de muestra por favor? Después de horas en esto me siento bastante muerto cerebral ... – Ryan

+0

¡Gracias! Lo probaré! – Ryan

1

Hay una gran example de un temporizador incorporado usando AsyncTask y un manipulador con el método postDelayed.

Tiene razón en que la actualización de la IU desde un fondo es un no-no.

+0

¡Gracias por responder! De hecho, lo vi, pero quiero hacerlo a través de hilos porque quiero aprender los hilos, ya que escuché que es muy importante a medida que avanzas en las lecciones y finalmente llegas a hacer algún tipo de juego ... ¿Puedes ayudarme a hacer esto a través de hilos por favor? – Ryan

+0

Tampoco veo que se use la tarea AsyncTask aquí –

3

Para este tipo de cosas, es un desperdicio utilizar otro hilo; es solo un desperdicio y lo hace así que tienes que lidiar con problemas de subprocesos múltiples. En su lugar, sólo tiene que utilizar Handler.sendDelayedMessage():

static final int MSG_DO_IT = 1; 
static final long TIME_BETWEEN_MESSAGES = 10 * 1000; // 10 seconds 

Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case MSG_DO_IT: { 

       // Update your UI here... 

       Message newMsg = obtainMessage(MSG_DO_IT); 
       sendMessageDelayed(newMsg, TIME_BETWEEN_MESSAGES); 
      } break; 
     } 
    } 
} 

@Override 
void onResume() { 
    super.onResume(); 

    // Start the timer, executing first event immediately. 
    Message newMsg = mHandler.obtainMessage(MSG_DO_IT); 
    mHandler.sendMessage(newMsg); 
} 

@Override 
void onPause() { 
    super.onPause(); 

    // Stop the timer. 
    mHandler.removeMessages(MSG_DO_IT); 
} 

Tenga en cuenta que esta aplicación tendrá cierta deriva - el tiempo real entre los mensajes es TIME_BETWEEN_MESSAGES + (tiempo de enviar mensaje). Si necesita algo que no se desplace, puede hacerlo usted mismo usando Hander.sendMessageAtTime() e incrementando el nuevo tiempo con un valor constante cada vez, comenzando con una hora inicial que obtiene con SystemClock.uptimeMillis() en onResume().

Cuestiones relacionadas