以精确的毫秒间隔将数据写入文件(在Android上)

以精确的毫秒间隔将数据写入文件(在Android上),android,Android,我正试图用Java(特别是Android service handler线程)将GPS位置信息以精确的时间间隔和毫秒分辨率(例如,每1、10或100毫秒)写入一个文件 我希望条目尽可能接近以下示例(对于dataWriteInterval=10ms): 我尝试过基于计时器的方法(以及更早的一种更简单的基于线程睡眠(delta)的方法),但我发现超过50%的写入至少晚了1毫秒…,例如: 1493296800 location X=... Y=... Z=... 1493296811 location

我正试图用Java(特别是Android service handler线程)将GPS位置信息以精确的时间间隔和毫秒分辨率(例如,每1、10或100毫秒)写入一个文件

我希望条目尽可能接近以下示例(对于
dataWriteInterval=10ms
):

我尝试过基于计时器的方法(以及更早的一种更简单的基于
线程睡眠(delta)
的方法),但我发现超过50%的写入至少晚了1毫秒…,例如:

1493296800 location X=... Y=... Z=...
1493296811 location X=... Y=... Z=...
1493296821 location X=... Y=... Z=...
1493296832 location X=... Y=... Z=...
1493296843 location X=... Y=... Z=...
1493296855 location X=... Y=... Z=...
我知道Android不是一个实时操作系统,但也许有人可以帮我一些提示,告诉我如何提高写入的准确性

例如,也许我可以以微秒的分辨率进行睡眠,并以更高的精度控制写作的时间(这将是一种忙碌的等待)。有什么建议吗

    isRunning = true;
    final long dataWriteInterval = 10;
    class WriteTask extends TimerTask {
        @Override
        public void run() {
            long intervalEntryTimestamp = Calendar.getInstance().getTimeInMillis();
            // ...write current location with timestamp to file (or log)...
            // e.g. 'timestamp location X=... Y=... Z=...' assumming that I have current location object (or the latest one for that matter)
            long timestampAfterWrite = Calendar.getInstance().getTimeInMillis();
            long writeTook = timestampAfterWrite - intervalEntryTimestamp;
            long delta = dataWriteInterval - writeTook;

            if (isRunning && delta > 0) {
                writeTimer.schedule(new WriteTask(), delta);
            } else if (isRunning) {
                writeTrackingData(timestampAfterWrite); // we are short of time - write immediately and schedule next
                writeTimer.schedule(new WriteTask(), dataWriteInterval);
            }
        }
    };
    WriteTask dataWriteTask = new WriteTask();
    writeTimer.schedule(dataWriteTask, dataWriteInterval); // schedule first

    // Keep-alive (parent thread)
    while (isRunning) {
        try {
            Thread.yield();
            Thread.sleep(500);
        } catch (InterruptedException e) { }
    }

可能是天真的建议,但如果需要10-11毫秒,试着“询问”9毫秒。它仍然是可变的,但可能更接近你想要的(我甚至不会问,如果你有一个毫秒分辨率时间戳来对比读数,为什么这么重要…)为什么会有否决票?感谢TripeHoun,这也是我目前正在做的,但我正在寻找更具分析性/可靠性/预测性和更少经验性的东西。在这种情况下,等待1ms似乎非常依赖CPU/系统负载,我觉得它可能会在不同的设备上产生意想不到的结果。关于不提问,而不是answer是这样的……这是我得到的一个非常严格的客户要求,这里的压力是要求输出文件具有相等的间隔和1ms的分辨率。这些文件将被输入到现有的系统中,需要给出精确的位置探测时间。如果没有“欺骗”和实际的时间戳,我看不到任何解决方案(即生成它们而不是仅仅获取和编写)但我认为值得尝试寻求一些帮助/想法/提示,所以首先。。。
    isRunning = true;
    final long dataWriteInterval = 10;
    class WriteTask extends TimerTask {
        @Override
        public void run() {
            long intervalEntryTimestamp = Calendar.getInstance().getTimeInMillis();
            // ...write current location with timestamp to file (or log)...
            // e.g. 'timestamp location X=... Y=... Z=...' assumming that I have current location object (or the latest one for that matter)
            long timestampAfterWrite = Calendar.getInstance().getTimeInMillis();
            long writeTook = timestampAfterWrite - intervalEntryTimestamp;
            long delta = dataWriteInterval - writeTook;

            if (isRunning && delta > 0) {
                writeTimer.schedule(new WriteTask(), delta);
            } else if (isRunning) {
                writeTrackingData(timestampAfterWrite); // we are short of time - write immediately and schedule next
                writeTimer.schedule(new WriteTask(), dataWriteInterval);
            }
        }
    };
    WriteTask dataWriteTask = new WriteTask();
    writeTimer.schedule(dataWriteTask, dataWriteInterval); // schedule first

    // Keep-alive (parent thread)
    while (isRunning) {
        try {
            Thread.yield();
            Thread.sleep(500);
        } catch (InterruptedException e) { }
    }