2017-05-04 155 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<>(); 
    }