Android 我开发的秒表落后于其他标准秒表8-10秒;增加

Android 我开发的秒表落后于其他标准秒表8-10秒;增加,android,Android,我已经用Android开发了秒表。秒表还具有圈数计算功能 我已经启动了秒表。我用多个标准秒表测试了我开发的秒表。问题是,1分钟后,开发的秒表一直落后于其他秒表&差距不断扩大。3分钟后我落后了8-10秒 我正在使用以下代码: 我使用的两个类,一个用于秒表实现,另一个用于秒表显示 StopwatchImplementation.java /** The timer used to implement the Stopwatch logic. */ pr

我已经用Android开发了秒表。秒表还具有圈数计算功能

我已经启动了秒表。我用多个标准秒表测试了我开发的秒表。问题是,1分钟后,开发的秒表一直落后于其他秒表&差距不断扩大。3分钟后我落后了8-10秒

我正在使用以下代码:

我使用的两个类,一个用于秒表实现,另一个用于秒表显示

StopwatchImplementation.java

        /** The timer used to implement the Stopwatch logic. */
                private Timer mSWatch = null;
                /**
                     * Starts the Stopwatch.
                     */
                    public void watchStart() {
                        if (mSWatch != null)
                            mSWatch .cancel();
                        mSWatch = new Timer();
                        mSWatch .schedule(new TimerTask() {
                            @Override
                            public void run() {
                                mListener.updateUIThread();
                            }

                        }, 0, 100);

                    }

    /** Runnable The Timer_ tick where the time is updated */
        Runnable Timer_Tick = new Runnable() {
            public void run() {
                updateTime(); // Updates the time , calculates the lap duration
            }
        };


    private int mHours = 0;

    /** The mins. */
    private int mMins = 0;

    /** The secs. */
    private int mSecs = 0;

    /** The fraction of a sec. */
    private int mFSec = 0;

    /** The lap hours. */
    private int mLapHours = 0;

    /** The lap mins. */
    private int mLapMins = 0;

    /** The lap secs. */
    private int mLapSecs = 0;

    /** The lap fraction of sec.... 1/10th of a sec*/
    private int mLapFSec = 0;

public void updateTime() {

        try {

            mLapFSec++;
            if (mLapFSec >= 10) {
                mLapFSec = 0;
                mLapSecs++;
                if (mLapSecs >= 60) {
                    mLapSecs = 0;
                    mLapMins++;
                    if (mLapMins >= 60) {
                        mLapMins = 0;
                        mLapHours++;
                    }
                }
            }

            mFSec++;
            if (mFSec >= 10) {
                mFSec = 0;
                mSecs++;
                if (mSecs >= 60) {
                    mSecs = 0;
                    mMins++;
                    if (mMins >= 60) {
                        mMins = 0;
                        mHours++;
                    }
                }
            }
}
StopwatchImplementation mStopWatch = new StopwatchImplementation(this);


/**
     * Update ui thread.
     */
    public void updateUIThread() {

        StopWatchScreen.this.runOnUiThread(mStopWatch.Timer_Tick);
    }

public void startPressed() {


        mStopWatch.watchStart();

    }
StopwatchScreen.java

        /** The timer used to implement the Stopwatch logic. */
                private Timer mSWatch = null;
                /**
                     * Starts the Stopwatch.
                     */
                    public void watchStart() {
                        if (mSWatch != null)
                            mSWatch .cancel();
                        mSWatch = new Timer();
                        mSWatch .schedule(new TimerTask() {
                            @Override
                            public void run() {
                                mListener.updateUIThread();
                            }

                        }, 0, 100);

                    }

    /** Runnable The Timer_ tick where the time is updated */
        Runnable Timer_Tick = new Runnable() {
            public void run() {
                updateTime(); // Updates the time , calculates the lap duration
            }
        };


    private int mHours = 0;

    /** The mins. */
    private int mMins = 0;

    /** The secs. */
    private int mSecs = 0;

    /** The fraction of a sec. */
    private int mFSec = 0;

    /** The lap hours. */
    private int mLapHours = 0;

    /** The lap mins. */
    private int mLapMins = 0;

    /** The lap secs. */
    private int mLapSecs = 0;

    /** The lap fraction of sec.... 1/10th of a sec*/
    private int mLapFSec = 0;

public void updateTime() {

        try {

            mLapFSec++;
            if (mLapFSec >= 10) {
                mLapFSec = 0;
                mLapSecs++;
                if (mLapSecs >= 60) {
                    mLapSecs = 0;
                    mLapMins++;
                    if (mLapMins >= 60) {
                        mLapMins = 0;
                        mLapHours++;
                    }
                }
            }

            mFSec++;
            if (mFSec >= 10) {
                mFSec = 0;
                mSecs++;
                if (mSecs >= 60) {
                    mSecs = 0;
                    mMins++;
                    if (mMins >= 60) {
                        mMins = 0;
                        mHours++;
                    }
                }
            }
}
StopwatchImplementation mStopWatch = new StopwatchImplementation(this);


/**
     * Update ui thread.
     */
    public void updateUIThread() {

        StopWatchScreen.this.runOnUiThread(mStopWatch.Timer_Tick);
    }

public void startPressed() {


        mStopWatch.watchStart();

    }
请提供有关计算哪里出错的任何输入

提前谢谢

亲切问候,


CB

您不能依赖
时间任务的调度来实现精确定时。您已要求每隔100毫秒调用一次
updateTime
方法,但Android系统只会大致遵循这一点-下次调用
updateTime
可能需要99或101毫秒。因此,您应该避免依赖于简单增加计数器的计时机制

因此,您应该记录开始时间,然后将当前时间与开始时间进行比较,以获得经过的时间量。例如:

private long startTime;

public void watchStart() {
    startTime = SystemClock.elapsedRealtime();
    ...
}

public void updateTime() {
    final long currentTime = SystemClock.elapsedRealtime();
    final long elapsedTime = currentTime - startTime;

    // convert elapsedTime in seconds, minutes etc
    final int seconds = (elapsedTime/1000)%60;
    final int minutes = (elapsedTime/(1000*60))%60;
    final int hours = (elapsedTime/(100*60*60))%24;
    ...
}

如果您发布了
updateTime()
的代码,可能会有所帮助。