站內搜尋

2011/2/24

[Java] Android 簡單的計時器程式分享 - Simple Timer

最近在修改一些前人寫的 Code,越改越是沒力。
看到了一段很爛的計時器寫法,我終於受不了而抓狂了.......

下面分享我個人改寫的版本,適用於 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));
    }
}

熱門文章