0

複数のセンサーからデータを取得する必要があります。すべてのセンサーに対して単一のリスナーを作成し、センサーごとに個別のリスナーを作成しようとしました。複数のセンサーが追加された場合、どちらの方法も機能しません。複数のセンサーが追加された場合、センサーによって生成されたデータは無効になります。誰かがこの問題の解決策を見つけましたか?

センサーを追加するコードは次のとおりです。

List <Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);

    //add sensor listeners
    for(Sensor curSensor : sensorList){
        sensorManager.registerListener(sensorListener,
            curSensor,
            SensorManager.SENSOR_DELAY_NORMAL);
    }

センサーの変更に応答するコードは次のとおりです。

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorListener = new SensorEventListener(){
        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1){

        }

        @Override
        public void onSensorChanged(SensorEvent event){
            sensorValues.put(Integer.valueOf(event.sensor.getType()),event.values);
            updateDisplayValues();
        }
    };

最後に、表示を更新するコードは次のとおりです。

    private void updateDisplayValues(){
    Enumeration<Integer> keys = sensorValues.keys();
    int curIndex = 0;

    while(keys.hasMoreElements()){

        Integer key = keys.nextElement();
        String curStringForKey = getStringForKey(key);

        if(curStringForKey==null)continue;

        float [] value = sensorValues.get(key);
        if(key==TYPE_ORIENTATION){
            ValueDisplay[curIndex].setText(curStringForKey + ": " + getResources().getConfiguration().orientation);
        }else{
            String stringToPrint = new String();
            int paramLength = value.length;
            for(int i = 0; i <paramLength; i++)
                stringToPrint += value[i]+", ";

            ValueDisplay[curIndex].setText(curStringForKey + ": " + stringToPrint);
        }
        curIndex ++;

    }

}
4

1 に答える 1

0

どういう意味:

センサーによって生成されたデータが無効です

問題は複数のセンサーを登録することではないと思います。センサーのタイプと値をonSensorChangedメソッドに出力するだけで、つまりLog.d()を使用すると、正常に機能するはずです。

SensorValuesオブジェクトの問題と、updateDisplayValuesメソッドでのアクセス方法については、スレッドセーフなタイプであることを確認してください。

センサーの更新は非常に高速であり、updateDisplayValues()でループを実行することは適切な設計ではないようです。

編集:

String stringToPrint = new String();
int paramLength = value.length;
        for(int i = 0; i <paramLength; i++)
            stringToPrint += value[i]+", ";

それはあなたの質問とは関係ありませんが、上記のコードは実際には良い習慣ではありません。文字列は不変のオブジェクトであるため、文字列を変更しようとするたびに(たとえば、stringToPrint + = "value")、新しい文字列オブジェクトが作成されます。代わりにStringBufferまたはStringBuilderを使用してください(一方はスレッドセーフで、もう一方はそうではありません)

于 2012-11-17T18:16:57.050 に答える