我正在使用Timer的代码是否有任何问题

时间:2014-07-20 07:03:11

标签: android timer

我正在尝试使用最近的时间并在TextView中显示它。并使用Timer和timerTask每秒获取当前时间并使用View对象的post方法更新UI。

以下是我的代码:

public class MainActivity extends Activity implements OnClickListener
{
  Button btnStart,btnStop;
  TextView txtRcntTime;
  Calendar c;
  private Timer timer;


  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initialize(); // method where i initialized all components

     c = Calendar.getInstance();

    btnStart.setOnClickListener(this);
    btnStop.setOnClickListener(this);
   }

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.buttonStart:
                start();
                break;
        case R.id.buttonStop:
                stop();
                 break;

    }
}

public void stop()
{
     if (timer!=null){
         timer.cancel();
         timer = null;
        }
  }

private void start() 
{
  if(timer != null)
    {  timer.cancel();  }

    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            SimpleDateFormat df1 = new SimpleDateFormat("hh-mm-ss a");
            String formattedDate1 = df1.format(c.getTime());
            updateView(formattedDate1);
        }
    };
    timer = new Timer(true);
    timer.schedule(task, 0, 1000);
}

public void updateView(final String t) 
{        
    txtRcntTime.post(new Runnable() {
        String t2 = t;
        @Override
        public void run() 
            {   txtRcntTime.setText(t2);       }
    });
}
}

结果显示第一次单击按钮但未更新时的时间。

1 个答案:

答案 0 :(得分:2)

<强>问题:

c = Calendar.getInstance();

它实际上正在更新,但您只获得一个日历实例,因此每隔1秒调用一次计时器任务就会给您一个同样的时间。

<强>溶液

通过每秒获取一次实例来更新日历

TimerTask task = new TimerTask() {

    @Override
    public void run() {
        SimpleDateFormat df1 = new SimpleDateFormat("hh-mm-ss a");
        Calendar cal = Calendar.getInstance();
        String formattedDate1 = df1.format(cal.getTime());
        updateView(formattedDate1);
    }
};