2010-05-13 48 views
2

我想創建一個簡單的android二進制時鐘,但我的應用程序崩潰。 我使用6個textview字段:3爲小數,3爲當前時間的二進制表示(HH:mm:ss)。 下面的代碼:簡單的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

當一個應用程序崩潰,您可以隨時看從模擬器或真實設備輸出的日誌。它在哪裏崩潰? – 2010-05-13 22:45:17

+0

具體而言,在Eclipse中使用'adb logcat',DDMS或DDMS透視圖來查找Java堆棧跟蹤。查找「引發者:」行以查找異常。 – CommonsWare 2010-05-13 23:53:33

+0

感謝您的回覆!是的,我通常使用LogCat來追蹤錯誤,但是我無法使用LogCat輸出來瞭解目前的錯誤。 – User3419 2010-05-14 08:07:36

回答

5

你試圖從另一個線程內更新您的視圖組件。你需要將你的組件更新分離成一個Runnable對象,並使用從第二個線程調用的Handler。

欲瞭解更多信息:

和代碼獎金:

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

非常感謝您的解釋和代碼。現在事情真的有道理! – User3419 2010-05-14 07:55:16

+0

沒問題,謝謝你張貼你的整個代碼塊。更容易看到發生了什麼事情,當你可以自己加載它時:D – Adam 2010-05-14 13:08:35