看到了一段很爛的計時器寫法,我終於受不了而抓狂了.......
下面分享我個人改寫的版本,適用於 Android,
但經過小修改,應該任何 Java 程式都可以用。
以下是在Android上寫的一個 Sample Code。
點擊數字則開始計時,再點停止。
只用了一點 Android 上的小東西,重要的部份都是利用 Java library 做的,
有興趣的人自己參考囉..
p.s 因為不想貼太多 code,所以元件的部份我就沒有用XML產生了,
真的想拿去用的人,還是建議不要直接建構元件來用。
package com.lak.android.sample; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class CodeSample extends Activity { private long mStartTime; private Timer mTimer = new Timer(); private TimerTask mClock; private boolean isRunning = false; private Handler mHandler = new Handler(); private TextView mTimeBox; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTimeBox = new TextView(this); mTimeBox.setText("00:00:00"); mTimeBox.setTextSize(40); //timeBox mTimeBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isRunning) { mClock = new TimerTask() { public void run() { if (mStartTime==0) { mStartTime = SystemClock.uptimeMillis(); } mHandler.post(new Runnable() { @Override public void run() { // 其實只有這裡重要.. SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); /* 這一步最關鍵,因為要扣掉時區的影響, 所以要把它減回去,不然台灣一開始錄就是 8 小時*/ sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String timeStr = sdf.format( new Date(SystemClock.uptimeMillis()- mStartTime)); mTimeBox.setText(timeStr); } }); } }; mStartTime = 0; mTimer.schedule(mClock, 0, 1000); isRunning = !isRunning; } else { mClock.cancel(); mTimer.purge(); isRunning = !isRunning; } } }); this.addContentView(mTimeBox, new ViewGroup.LayoutParams(200, 200)); } }
沒有留言:
張貼留言