2012-01-01 131 views
3

因此,我試圖編寫一個秒錶應用程序,以毫秒爲單位顯示時間,但由於某種原因,它不起作用。基本上我只有一個按鈕,在按下按鈕後,開始打印從開始時間到當前時間的毫秒......但在模擬器中,應用程序鎖定。怎麼了?Android毫秒

public class testing extends Activity { 
/** Called when the activity is first created. */ 
Button start,stop; 
long init,now,time; 
TextView display; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 
    display = (TextView) findViewById(R.id.chronometer1); 
    final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff); 
    passTog.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      init=System.currentTimeMillis(); 
      while(passTog.isChecked()) 
      { 
       now=System.currentTimeMillis(); 
       time=now-init; 
       display.setText("t: " + time); 
      } 

     } 
    }); 
} 

}

回答

8

你喜歡你的OnClickListener內做絕對不應該運行一個繁忙的循環。這就是爲什麼該應用程序鎖定。你需要讓系統的其他部分有發言權。此外,每30毫秒左右更新一次顯示器就沒有意義了,因爲這是人眼可以追蹤的最快速度。另外,您可能想要在活動暫停時掛起計時器。下面是做所有版本:

public class testing extends Activity { 

    /** Called when the activity is first created. */ 
    Button start,stop; 
    long init,now,time,paused; 
    TextView display; 
    Handler handler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     handler = new Handler(); 
     setContentView(R.layout.test); 
     display = (TextView) findViewById(R.id.chronometer1); 
     final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff); 
     final Runnable updater = new Runnable() { 
      @Override 
      public void run() { 
       if (passTog.isChecked()) { 
        now=System.currentTimeMillis(); 
        time=now-init; 
        display.setText("t: " + time); 
        handler.postDelayed(this, 30); 
       } 
      } 
     }; 
     passTog.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       init = System.currentTimeMillis(); 
       handler.post(updater); 
      } 
     }); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     paused = System.currentTimeMillis(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     init += System.currentTimeMillis() - paused; 
    } 
} 
+2

錯誤。 OP想要開始點擊按鈕點擊,而不是創建活動 – codeling 2012-01-01 17:55:38

+0

@nyarlathotep - 現在明白了。相應地更新我的代碼。 – 2012-01-01 18:07:31

+0

現在包括很好的例子,豎起大拇指!但是,爲什麼在onCreate中初始化init * only *?在看OP的問題時,我想說他想在buttonclick上啓動秒錶,而不是在創建活動;還是我在這裏誤解了一些東西? – codeling 2012-01-01 18:07:35

0

你把setText()方法在你onClick(),等會你單擊該按鈕每一秒? 它甚至不是一個線程! 請嘗試使用CountDownTimer類的onTick()方法。