2012-01-01 133 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()方法。