2011-01-04 3 views
1

기본적으로 응용 프로그램이 시작될 때부터 0 시부 터 시작하는 초와 분을 추적하여 TextView에 표시합니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까?간단한 디지털 타이머를 안드로이드로 생성합니다.

+0

비슷한 것을 구현해야했고 [다음] (http://android-developers.blogspot.com/2007/11/stitch-in-time.html) android 개발자 블로그 게시물이 도움이됨을 발견했습니다. 모두 제일 좋다. –

+0

내가 할 수없는 일은 그 코드를 얻는 것 같습니다. 2 개의 onClick 리스너, mStartListener 및 mStopListener를 만들었지 만 코드는 아무 것도 첨부되지 않은 것을 보여주지 않습니다. mStartListener를 버튼에 연결하면 한 번 이상한 숫자로 업데이트됩니다. 당신은 아직도 그 일을하기 위해 사용한 코드가 있습니까? 당신의 도움을 주셔서 감사합니다. – clayton33

답변

3

Timer을 사용하면 초 단위로 TimerTask을 예약 할 수 있습니다.

  • 먼저 당신은 당신이 양식 XX의 String으로이 차이를 포맷 (beginning time - current time)
  • 소요되는 시간을 얻을 TimerTask를 작업에
  • 다음 시작 시간을 : XX를 DateFormat
  • 함께 TextView를이 문자열로 업데이트하십시오.

TimerTask 작업에서 TextView를 업데이트 할 때 UI 스레드에서 실행되지 않으므로 문제가 발생할지 모르겠습니다. 이 작업을 수행하려면 Activity.runOnUiThread을 사용할 수 있습니다.

4

타이머가 비 UI 스레드를 시작하기 때문에 TextView 업데이트에 타이머를 사용하지 않는 것이 좋습니다. 귀하의 경우 Timer는 Handler 클래스로 대체 될 수 있습니다. 또한이 새로운 비 UI 스레드의 오버 헤드를 피할 수 있습니다. Here은 예입니다

private Handler mHandler = new Handler(); 

OnClickListener mStartListener = new OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     if (mStartTime == 0L) 
     { 
     mStartTime = System.currentTimeMillis(); 
     mHandler.removeCallbacks(mUpdateTimeTask); 
     mHandler.postDelayed(mUpdateTimeTask, 100); 
     } 
    } 
}; 

......... 

private Runnable mUpdateTimeTask = new Runnable() 
{ 
    public void run() 
    { 
    final long start = mStartTime; 
    long millis = SystemClock.uptimeMillis() - start; 
    int seconds = (int) (millis/1000); 
    int minutes = seconds/60; 
    seconds  = seconds % 60; 

    if (seconds < 10) 
    { 
     mTimeLabel.setText("" + minutes + ":0" + seconds); 
    } 
    else 
    { 
     mTimeLabel.setText("" + minutes + ":" + seconds);    
    } 

    mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000)); 
    } 
}; 
+1

이 답변은 아마도'currentTimeMillis'가 1970 년 이래로 시간을 반환 할 것이므로'millis'의 값은 음수가 될 것입니다 –

2
Runnable run = new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      long millis = System.currentTimeMillis() - starttime; 
       int seconds = (int) (millis/1000); 
       int minutes = (seconds%3600)/60; 
       int hours = seconds/3600; 
       seconds  = seconds % 60; 

       et1.setText(String.format("%02d:%02d:%02d",hours, minutes, seconds)); 
    //   et2.setText(String.format("%02d:%02d:%02d",hours, minutes, seconds)); 
     //   et3.setText(String.format("%02d:%02d:%02d",hours, minutes, seconds)); 

       h2.postDelayed(this, 500); 
     } 
    }; 

    class firstTask extends TimerTask { 

     public void run() { 
      handler.sendEmptyMessage(0); 
     } 
}; 

통해 UR 프로그램에서 그것을 시도 ...!

관련 문제