0

我编写了一个 Activity,其中包含一些类似秒表的代码。它确实需要准确,问题是它逐渐落后于实时。这是问题代码的一个较小的示例:

import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

public static final int TIME_STEP = 500;    // milliseconds between updates
private Handler mHandler = new Handler();
private long mTimeElapsed = 0;

private Runnable mUpdateTimeTask = new Runnable()
{
    private long mOldTime = 0;      // previous real time (ms) that run() was called

    public void run()
    {
        mHandler.postDelayed(mUpdateTimeTask, TIME_STEP);

        long currentTime = new Date().getTime();
        long realDelay = currentTime - mOldTime;    // the actual delay between successive calls to run()
        if (mOldTime != 0)
            mTimeElapsed += realDelay;
        Log.d(this.toString(), "time elapsed = " + mTimeElapsed/1000);

        // some slow operations here...

        mOldTime = currentTime;
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTimeElapsed = 0;
    mHandler.removeCallbacks(mUpdateTimeTask);
    mHandler.postDelayed(mUpdateTimeTask, 0);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}

为了说明问题:在运行应用程序 8:23(根据 logcat 时间戳)后,mTimeElapsed 将是 456 秒,即 7:36。

由于连续调用 run() 之间的延迟是使用 getTime() 计算的(即它不假设真正的延迟将是 TIME_STEP),我不明白为什么这会不同步?

我已经在模拟器和实际设备上对此进行了测试,结果相同。

编辑:时间结果是针对发布的代码,即即使没有“缓慢的操作”,尽管在这里完成工作似乎会加剧延迟

请不要只提供一些替代方法来实现相同的目标。我本身并不反对替代方案,我只是很想知道为什么这段代码不能按预期工作。谢谢!

4

2 回答 2

2

如果没有更多代码,不清楚您的时间计算和其他方法到底发生了什么。但是,似乎很清楚的是,您的方法似乎没有正确测量经过的时间。

据我所知,“经过的时间”由 run() 调用之间的延迟组成。这不等于从程序开始经过的时间,因为我假设在这些点之间发生了很多小事情,这些事情会导致损失时间的累积。您是否有理由不简单地检索开始时间,然后只计算当前时间和开始时间之间的差异?

于 2012-11-05T18:56:14.110 回答
0

几个注意事项:

a) 不清楚您到底想在 mTimeElapsed 中计算什么?您是否尝试计算在活动上花费的总时间?您是否尝试计算在 run() 中花费的总时间(大约等于在“一些缓慢的操作”上花费的时间)?您是否尝试计算在 run() 之外花费的总时间?

b)根据您的代码,您所做的是计算(大约)从 run() 退出和 run() 的下一次执行之间花费的时间(在 run 之外花费的时间)。这是你需要的吗?

于 2012-11-05T18:47:41.767 回答