2017-05-04 117 views
0

所以我试图分析传感器的一些数据。我想让数组列表“填满”数据,然后在500ms后,线程消失并处理它。看起来这个线程只执行一次(我知道这是应该发生的事情),但我无法想出一个方法来执行它多次,它睡了500毫秒。我尝试使用while(true),lock,handler,timer并没有得到任何好处。执行线程onSensorChanged

public void onSensorChanged(SensorEvent sensorEvent) { 
    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     accSensorVals = lowPass(sensorEvent.values.clone(), accSensorVals); 
    } 

    xAxisValues.add(accSensorVals[0]); // [0] - X axis 
    yAxisValues.add(accSensorVals[1]); // [1] - Y axis 
    zAxisValues.add(accSensorVals[2]); // [2] - Z axis 

    new Thread() { 
     public void run() { 
       try { 
        Thread.sleep(DELAY); // delay for 500 ms 
        checkSpikes(xAxisValues, yAxisValues, zAxisValues); 
        xAxisValues = new ArrayList<>(); 
        yAxisValues = new ArrayList<>(); 
        zAxisValues = new ArrayList<>(); 
       } catch (Exception e) {} 
     } 
    }.start(); 
} 

回答

0

首先“同步”,如果您想从传感器获取数据时处理数据,可能会发生冲突。你应该知道这一点。

其次,在android使用服务来收集传感器数据。检查这个链接https://developer.android.com/guide/components/services.html
你共享的当前线程只运行一次,你应该在线程内创建一个循环。

public void onSensorChanged(SensorEvent sensorEvent) { 
    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     accSensorVals = lowPass(sensorEvent.values.clone(), accSensorVals); 
    } 

    xAxisValues.add(accSensorVals[0]); // [0] - X axis 
    yAxisValues.add(accSensorVals[1]); // [1] - Y axis 
    zAxisValues.add(accSensorVals[2]); // [2] - Z axis 

    new Thread() { 
     public void run() { 
       try { 
        while(true){ 
        checkSpikes(xAxisValues, yAxisValues, zAxisValues); 
        xAxisValues = new ArrayList<>(); 
        yAxisValues = new ArrayList<>(); 
        zAxisValues = new ArrayList<>(); 
        Thread.sleep(DELAY); // delay for 500 ms 
        } 


       } catch (Exception e) {} 
     } 
    }.start(); 
} 

或者,如果你想暂停收集和公正处理数据,你应该做这样的事情:

private boolean fetch = true; 
public void onSensorChanged(SensorEvent sensorEvent) { 
    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     accSensorVals = lowPass(sensorEvent.values.clone(), accSensorVals); 
    } 

    xAxisValues.add(accSensorVals[0]); // [0] - X axis 
    yAxisValues.add(accSensorVals[1]); // [1] - Y axis 
    zAxisValues.add(accSensorVals[2]); // [2] - Z axis 

    new Thread() { 
     public void run() { 
       try { 
        while(true){ 
        if(fetch){ 
        checkSpikes(xAxisValues, yAxisValues, zAxisValues); 
        xAxisValues = new ArrayList<>(); 
        yAxisValues = new ArrayList<>(); 
        zAxisValues = new ArrayList<>(); 
        Thread.sleep(DELAY); // delay for 500 ms 
        } 
        } 


       } catch (Exception e) {} 
     } 
    }.start(); 
} 
+0

我使用这段代码在后台服务已经,并使用while循环消耗CPU周期的很多,所以我不认为会是最佳解决方案。但是,您的解决方案似乎仍然无法正常工作。不过谢谢你。 –

+0

然后检查此无限循环,https://developer.android.com/reference/android/app/AlarmManager.html –

0

回答我的问题。我已经初始化了一个时间变量lastUpdate,它现在可以获得时间,然后将它与现在的时间进行比较,如果这有意义,并且差异大约是500,我将执行我的数据处理。我得到了这个职位的想法:

How to log data from Android Motion Sensors at a fixed rate

long curTime = System.currentTimeMillis(); 

    if ((curTime - lastUpdate) >= 500){ 
     lastUpdate = curTime; 
     checkSpikes(xAxisValues, yAxisValues, zAxisValues); 
     xAxisValues = new ArrayList<>(); 
     yAxisValues = new ArrayList<>(); 
     zAxisValues = new ArrayList<>(); 
    }