写入csv文件时出现重复的传感器值问题

时间:2019-04-14 21:54:47

标签: android performance android-sensors

我有一个Android应用程序,它以100hz的频率从加速度传感器和旋转矢量传感器获取数据。它还每1秒从GPS获取一次位置。该应用程序每10毫秒对计时器上收集的数据进行一些计算。并将结果存储在一个csv文件中,每3分钟将其上传到Firebase。

问题是,即使位置侦听器在单独的线程上运行并且传感器侦听器在单独的线程上运行,结果csv文件上仍有许多连续的重复值,并且写入文件和上载到Firebase都是异步完成的

该应用程序的iOS版本是使用swift本地编写的,过程大致相同,但没有此问题。

mSensorThread = new HandlerThread("Sensor thread", Thread.MAX_PRIORITY);
mSensorThread.start();
Handler mSensorHandler = new Handler(mSensorThread.getLooper());

mSensorManager.registerListener(this, mAccelerometer, 10000,9000,mSensorHandler);
mSensorManager.registerListener(this, mRotationVector, 10000,9000, mSensorHandler);
mLocationThread = new HandlerThread("Location thread", Thread.MAX_PRIORITY);
mLocationThread.start();
Looper looper = mLocationThread.getLooper();

LocationServices.FusedLocationApi.requestLocationUpdates (mGoogleApiClient, mLocationRequest, this, looper).addStatusListener(new PendingResult.StatusListener() {
    @Override
    public void onComplete(Status status) {
        startRecording();
    }
});
t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        // some calculations on sensors data.
    }
}, 0, period);
private void writeToCsvFileAndFirebase(final String data, final Date lastDate) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            // write the file and upload to firebase every 3 minuets.
            // this function is called from the scheduled timer.
        }
    });
    thread.start();
}

1 个答案:

答案 0 :(得分:0)

每个expect听起来都是有问题的,而这部分甚至不见了;当值仅每10ms更改时,我什至不明白为什么10ms。如果在那里打开/写入/关闭文件,注定会失败;将这些值保留在RAM中并偶尔将它们刷新到文件中,可能会减少处理开销。

我的意思是,仅考虑处理时间和异步操作,这可能会导致迭代相互干扰。减小间隔可能值得一试-或更好地使用Semaphore来防止可能的比赛状况,而与间隔无关; 100ms是共享资源。

CSV总是比Java慢一点。可以选择使用JNI