Pergunta

Quero criar um relógio binário Android simples, mas meu aplicativo trava. Eu uso 6 campos de textView: 3 para decimal e 3 para a representação binária do horário atual (hh: mm: ss). Aqui está o 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) { };
 }
}`
Foi útil?

Solução

Você está tentando atualizar seus componentes de visualização de outro tópico. Você precisa separar suas atualizações de componentes em um objeto executável, com um manipulador chamado do segundo thread.

Para mais informações: https://developer.android.com/guide/appendix/faq/commontasks.html#threading

E código para bônus:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top