Android Thread para un temporizador

public class MainActivity extends Activity { int min, sec; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); min = 5; sec = 0; final TextView timer1 = (TextView) findViewById(R.id.timer1); timer1.setText(min + ":" + sec); Thread t = new Thread() { public void run() { sec-=1; if (sec<0) { min-=1; sec=59; } timer1.setText(min + ":" + sec); try { sleep(1000); } catch (InterruptedException e) {} } }; t.start(); } } 

Este es un código para un subproceso en Java pero no funciona. ¿Me puedes ayudar?

Es un temporizador que cuenta desde 5 minutos hasta 0:00.

En tu caso estás usando hilos. Por lo tanto, no puede actualizar ui desde el hilo que no sea el hilo de la interfaz de usuario. ASÍ QUE usas runOnUithread . Le sugiero que use un temporizador de cuenta regresiva o un Manejador.

1.CountDownTimer

http://developer.android.com/reference/android/os/CountDownTimer.html

Aquí hay un enlace a otro ejemplo. Te sugiero que compruebes el enlace para el temporizador de cuenta atrás.

Countdowntimer en minutos y segundos

Ejemplo:

  public class MainActivity extends Activity { Button b; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.textView1); b= (Button) findViewById(R.id.button1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub startTimer(200000); } }); } private void startTimer(long time){ CountDownTimer counter = new CountDownTimer(30000, 1000){ public void onTick(long millisUntilDone){ Log.d("counter_label", "Counter text should be changed"); tv.setText("You have " + millisUntilDone + "ms"); } public void onFinish() { tv.setText("DONE!"); } }.start(); } } 

2. Puedes usar un controlador

Ejemplo:

 Handler m_handler; Runnable m_handlerTask ; int timeleft=100; m_handler = new Handler(); m_handlerTask = new Runnable() { @Override public void run() { if(timeleft>=0) { // do stuff Log.i("timeleft",""+timeleft); timeleft--; } else { m_handler.removeCallbacks(m_handlerTask); // cancel run } m_handler.postDelayed(m_handlerTask, 1000); } }; m_handlerTask.run(); 

3.Timer

Timer se ejecuta en un hilo diferente. Debes actualizar ui en el hilo de la interfaz de usuario. use runOnUiThread

Ejemplo:

  int timeleft=100; Timer _t = new Timer(); _t.scheduleAtFixedRate( new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() //run on ui thread { public void run() { Log.i("timeleft",""+timeleft); //update ui } }); if(timeleft>==0) { timeleft--; } else { _t.cancel(); } } }, 1000, 1000 ); 

Está intentando actualizar el UI Thread de la UI Thread de un Thread fondo con

 timer1.setText( 

que no puedes hacer Necesita usar runOnUiThread() , AsyncTask , AsyncTask , o algo similar.

Consulte esta respuesta para ver un ejemplo de runOnUiThread()

Pero CountDownTimer es bueno para cosas como esta.

Además, al publicar una pregunta en SO, las declaraciones como “no funciona”. son muy vagos y a menudo inútiles. Indique los resultados esperados en comparación con los resultados reales de su código y logcat si la aplicación se bloquea.