Pregunta

Quiero crear un simple androide reloj binario, pero mi aplicación se bloquea. Utilizo 6 campos TextView: 3 para el decimal y 3 para la representación binaria de la hora actual (HH: mm: ss). Aquí está el código:

import java.text.SimpleDateFormat;
import java.util.Calendar;

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

public class Binary extends Activity implements Runnable
{
 Thread runner;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

  if (runner == null)
  { //start the song
   runner = new Thread(this);
   runner.start();
  }
    }

 @Override
 public void run()
 {
  TextView hours_dec = (TextView) findViewById(R.id.hours_dec);
  TextView mins_dec = (TextView) findViewById(R.id.mins_dec);
  TextView secs_dec = (TextView) findViewById(R.id.secs_dec);
  TextView hours_bin = (TextView) findViewById(R.id.hours_bin);
  TextView mins_bin = (TextView) findViewById(R.id.mins_bin);
  TextView secs_bin = (TextView) findViewById(R.id.secs_bin);

        SimpleDateFormat hours_sdf = new SimpleDateFormat("HH");
        SimpleDateFormat mins_sdf = new SimpleDateFormat("mm");
        SimpleDateFormat secs_sdf = new SimpleDateFormat("ss");

        Calendar cal = Calendar.getInstance();

  while (runner != null)
  {
   WaitAMoment();
   cal.getTime();

   hours_dec.setText(hours_sdf.format(cal.getTime()));
   mins_dec.setText(mins_sdf.format(cal.getTime()));
   secs_dec.setText(secs_sdf.format(cal.getTime()));

   hours_bin.setText(String.valueOf(Integer.toBinaryString(Integer.parseInt((String) hours_dec.getText()))));
   mins_bin.setText(String.valueOf(Integer.toBinaryString(Integer.parseInt((String) mins_dec.getText()))));
   secs_bin.setText(String.valueOf(Integer.toBinaryString(Integer.parseInt((String) secs_dec.getText()))));
  }

 }

 protected void WaitAMoment()
 {
  try
  {
   Thread.sleep(100);
  } catch (InterruptedException e) { };
 }
}`
¿Fue útil?

Solución

Usted está tratando de actualizar sus componentes de vista desde el interior de otro hilo. Es necesario separar sus actualizaciones de componentes en un objeto ejecutable, con un manejador que se llama desde el segundo subproceso.

Para más información: https://developer.android.com /guide/appendix/faq/commontasks.html#threading

Y el código de bono:

package stackoverflow.test.binaryclock;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

public class BinaryClock extends Activity implements Runnable
{
    Date currentTime;
     Thread runner;
     final Runnable updater = new Runnable(){
        public void run(){
            updateClockValues();
        };
     };
     final Handler mHandler = new Handler();
    TextView hours_dec;
    TextView mins_dec;
    TextView secs_dec;
    TextView hours_bin;
    TextView mins_bin;
    TextView secs_bin;

    SimpleDateFormat hours_sdf = new SimpleDateFormat("HH");
    SimpleDateFormat mins_sdf = new SimpleDateFormat("mm");
    SimpleDateFormat secs_sdf = new SimpleDateFormat("ss");

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        currentTime = Calendar.getInstance().getTime();
        hours_dec = (TextView) findViewById(R.id.hours_dec);
        mins_dec = (TextView) findViewById(R.id.mins_dec);
        secs_dec = (TextView) findViewById(R.id.secs_dec);
        hours_bin = (TextView) findViewById(R.id.hours_bin);
        mins_bin = (TextView) findViewById(R.id.mins_bin);
        secs_bin = (TextView) findViewById(R.id.secs_bin);
        if (runner == null)
        { //start the song
           runner = new Thread(this);
           runner.start();
        }
      }

 private void updateClockValues() {
        currentTime = Calendar.getInstance().getTime();
        hours_dec.setText(hours_sdf.format(currentTime.getTime()));
        mins_dec.setText(mins_sdf.format(currentTime.getTime()));
        secs_dec.setText(secs_sdf.format(currentTime.getTime()));

        hours_bin.setText(String.valueOf(Integer.toBinaryString(Integer.parseInt((String) hours_dec.getText()))));
        mins_bin.setText(String.valueOf(Integer.toBinaryString(Integer.parseInt((String) mins_dec.getText()))));
        secs_bin.setText(String.valueOf(Integer.toBinaryString(Integer.parseInt((String) secs_dec.getText()))));
    }
@Override
 public void run()
 {
  while (runner != null)
  {
      try
      {
       Thread.sleep(1000);
       Log.i("Tick", "Tock");
      } catch (InterruptedException e) { };
      mHandler.post(updater);
     }
 }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top