2012-01-01 3 views
3

私はミリ秒単位で時間を表示するストップウォッチアプリを作成しようとしていますが、何らかの理由で動作しません。基本的には、押された後、開始時刻から現在時刻までのミリ秒単位の印刷を開始するトグルボタンがあります...しかし、シミュレータでは、アプリケーションがロックアップします。どうしましたか?Android milliseconds

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ミリ秒ごとに1回以上表示を更新することは意味がありません。これは、人間の目が追跡できる最も速い速度であるためです。また、アクティビティが一時停止しているときにタイマーを一時停止したい場合もあります。あなたのonClick()

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

+0

@nyarlathotep - 今すぐ入手しました。それに従って私のコードを更新しました。 –

+0

今すぐ良い例が含まれています。しかし、なぜonCreateでinit * only *を初期化するのですか? OPの質問を見ると、私は彼がアクティビティ作成ではなく、ボタンクリックでストップウォッチを開始したいと言っていました。私はここで何か誤解していますか? – codeling

0

あなたはsetText()方法を置くので、あなたは、ボタンをクリックします毎秒:ここではすべてがないバージョンがありますか? それもスレッドではありません! メソッドをCountDownTimerクラスに変更してください。

関連する問題