2011-06-19 48 views
4

我想在TextView中實時顯示時間和日期(按分鐘更新)。目前,我有這個。考慮到內存使用和Android最佳實踐,這是做這件事的最佳方式嗎? (注意:DateFormatjava.text.DateFormat在Android中更新時間和日期第二秒

private Thread dtThread; 

public void onCreate(Bundle savedInstanceState) { 
    ... 
    getDateAndTime(); 
} 

private void getDateAndTime() { 
    dtThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      Log.d(TAG, "D/T thread started"); 
      while (!Thread.currentThread().isInterrupted()) { 
       try { 
        update(); 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        Log.d(TAG, "D/T thread interrupted"); 
       } 
      } 
     } 

     public void update() { 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Date d = new Date(); 
        String time = DateFormat.getTimeInstance(DateFormat.MEDIUM).format(d); 
        String date = DateFormat.getDateInstance(DateFormat.LONG).format(d); 

        TextView timeView = (TextView) findViewById(R.id.textStartTime); 
        TextView dateView = (TextView) findViewById(R.id.textStartDate); 
        timeView.setText(time); 
        dateView.setText(date); 
       } 

      }); 
     } 

    }); 

    dtThread.start(); 
} 

protected void onPause() { 
    super.onPause(); 
    dtThread.interrupt(); 
    dtThread = null; 
} 

protected void onResume() { 
    super.onResume(); 
    getDateAndTime(); 
} 

回答

5

我會使用Runnable並將其與延遲發佈到Handler。

public class ClockActivity extends Activity { 

    private SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); 

    private TextView mClock; 
    private boolean mActive; 
    private final Handler mHandler; 

    private final Runnable mRunnable = new Runnable() { 
     public void run() { 
      if (mActive) { 
       if (mClock != null) { 
        mClock.setText(getTime()); 
       } 
       mHandler.postDelayed(mRunnable, 1000); 
      } 
     } 
    }; 

    public ClockActivity() { 
     mHandler = new Handler(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mClock = (TextView) findViewById(R.id.clock_textview); 
     startClock(); 
    } 

    private String getTime() { 
     return sdf.format(new Date(System.currentTimeMillis())); 
    } 

    private void startClock() { 
     mActive = true; 
     mHandler.post(mRunnable); 
    } 
} 
1

而不是設計自己的計時器來處理這個問題,我建議使用廣播reciever上市這一意圖broadcastet發出的每minut:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

,如果您像如何做到這一點的示例代碼,請讓我知道。

+0

它似乎不像'ACTION_TIME_TICK'允許我第二次更新。在這方面,使用廣播接收器在我看來就像是Rube Goldberg這樣做的方式。 – kibibyte

+1

正確,'ACTION_TIME_TICK'每分鐘更新一次。但是如果你想更新文本視圖來顯示日期和時間到分鐘,它應該執行你需要的任務。 – Dimse