2010-05-13 8 views
2

Je veux créer une horloge binaire Android simple, mais mon application se bloque. J'utilise 6 champs de textview: 3 pour la décimale et 3 pour la représentation binaire de l'heure actuelle (HH: mm: ss). Voici le code:Simple horloge binaire Android

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) { }; 
} 
}` 
+1

Quand une application se bloque, vous pouvez toujours regarder à la sortie du journal du simulateur ou du dispositif réel. Où se bloque-t-il? –

+0

Spécifiquement, utilisez 'adb logcat', DDMS ou la perspective DDMS dans Eclipse pour trouver votre trace de pile Java. Recherchez la ligne "Caused By:" pour trouver l'exception. – CommonsWare

+0

Merci pour les réponses ici aussi! Oui, j'utilise normalement LogCat pour tracer des erreurs mais je ne pouvais rien comprendre à propos de la présente en utilisant la sortie LogCat. – User3419

Répondre

5

Vous essayez de mettre à jour vos composants à l'intérieur Voir un autre thread. Vous devez séparer vos mises à jour de composants dans un objet Runnable, avec un gestionnaire appelé à partir du deuxième thread.

Pour plus d'informations:

et code bonus:

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); 
    } 
} 
} 
+0

Merci beaucoup pour l'explication et le code. Maintenant, les choses ont vraiment du sens! – User3419

+0

pas de problème, merci de poster votre bloc de code entier. beaucoup plus facile de voir ce qui se passe quand vous pouvez le charger vous-même et muck autour: D – Adam