Simple androide binario Texto Reloj
-
26-09-2019 - |
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) { };
}
}`
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