看到了一段很爛的計時器寫法,我終於受不了而抓狂了.......
下面分享我個人改寫的版本,適用於 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));
}
}
沒有留言:
張貼留言