2016-12-28 3 views
0

私はセンサーを使用するアプリケーションで作業しています。 センサーデータをの順でコンソールに表示する機会があります。まず、加速度計、次の磁力計データからデータを取得して表示します。 現在、データはランダムに表示されます。一度加速度計、一度磁力計。時々それらは2回現われる。私はあなたのアプローチで間違って何かがあることを信じていセンサデータを順次取得する方法は?

public class StartFragment extends Fragment implements SensorEventListener { 

private SensorManager sensorManager; 
private Sensor accelerometer; 
private Sensor magnetic; 
private static final int PERIOD = 10000; 
private Handler handler; 
boolean flag = false; 

private final Runnable processSensors = new Runnable() { 
    @Override 
    public void run() { 
     sensorManager.registerListener(StartFragment.this, accelerometer, SensorManager.SENSOR_DELAY_UI); 
     sensorManager.registerListener(StartFragment.this, magnetic, SensorManager.SENSOR_DELAY_UI); 
     flag = true; 

     handler.postDelayed(this, PERIOD); 
    } 
}; 

public StartFragment(){} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_start, container, false); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); 
    sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE); 
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    handler.post(processSensors); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    handler.removeCallbacks(processSensors); 
    sensorManager.unregisterListener(this, accelerometer); 
    sensorManager.unregisterListener(this, magnetic); 
} 

@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 
    float[] value = sensorEvent.values; 
    if (flag) { 

     Log.d("Current sensor: ", sensorEvent.sensor.getName() + " x: " + Float.toString(value[0])); 
     Log.d("Current sensor: ", sensorEvent.sensor.getName() + " y: " + Float.toString(value[1])); 
     Log.d("Current sensor: ", sensorEvent.sensor.getName() + " z: " + Float.toString(value[2])); 

     flag = false; 
    } 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int i) {} 

答えて

2

は、ここに私のコードです。センサーは非同期で動作し、応答すると応答します。ソフトウェアの役割は、回答を得て、それが来たときに使用することです。

あなたの場合のソリューションimhoは、以前のセンサの値を取得した後にセンサを起動して初期化するか、非同期で動作させ、視覚化を独立させます(つまり、 mvpプログラミングの基礎)

+0

どのように私のアプローチを非同期にするのですか?いくつかの貴重なヒント? – phoenix37

+0

私はあなたがちょうどonSensorChangedメソッドの中にいくつかのif()を追加できると思います。それは、どのセンサーデータが受信されたかに応じて、異なるセンサーデータを表示するためのさまざまなメソッドを呼び出します。あなたは絶対に*その順序で情報を表示しなければなりませんか? –

+0

はい、次はデータベースにデータを格納していたからです。私は加速度計からの1行のデータ、磁力計からの2行目のデータなど、構造をもっと知りたい – phoenix37

関連する問題