Androidプログラミングの基礎を学んでいます。
私は、加速度計、磁力計、および方向データを外部ファイルに記録しながら表示する単純なAndroidテストアプリケーションを持っています。メソッドinitLoggerを呼び出して、 [開始] ボタン (関連するセンサーの registerListener)のクリックでログ記録プロセスを開始します。
これに似ているものは...
public void initLogger(View view)
{
boolean bFlag = false;
Button btnStart = (Button)findViewById(R.id.btnStartLog);
Button btnStop = (Button)findViewById(R.id.btnStopLog);
btnStart.setEnabled(bFlag);
btnStop.setEnabled(!bFlag);
bEnableLogging = true;
//Start reading the sensor values
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
//so on....
ロギング プロセスを停止する [停止] ボタンもあります (最後に、各センサーの unregisterListener を呼び出して登録を解除します)。
データ取得プロセスは、関連するセンサーからデータを取得し、それぞれの UI 要素に値を設定し、最終的にデータを外部の .csv ファイルに記録するonSensorChangedハンドラー内で発生します。
onSensorChanged イベントハンドラは次のようになります...
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
// accelerometer
TextView tAX = (TextView) findViewById(R.id.txtViewAxValue);
TextView tAY = (TextView) findViewById(R.id.txtViewAyValue);
TextView tAZ = (TextView) findViewById(R.id.txtViewAzValue);
// magnetic field
TextView tMX = (TextView) findViewById(R.id.txtViewMx);
TextView tMY = (TextView) findViewById(R.id.txtViewMy);
TextView tMZ = (TextView) findViewById(R.id.txtViewMz);
if (bEnableLogging) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerdata = event.values.clone();
tAX.setText(Double.toString(accelerometerdata[0]));
tAY.setText(Double.toString(accelerometerdata[1]));
tAZ.setText(Double.toString(accelerometerdata[2]));
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticmatrixdata = event.values.clone();
tMX.setText(Double.toString(magneticmatrixdata[0]));
tMY.setText(Double.toString(magneticmatrixdata[1]));
tMZ.setText(Double.toString(magneticmatrixdata[2]));
}
// so on ....
構成されたすべてのセンサーからデータを受信しますが、データを受信する速度を制御することはできません。すなわち
SensorChanged イベントは、センサー データが変更されたときに発生することを知っています。ただし、このイベントを固定レートで発生させたいと考えています。例: 40ms ごと
質問:
- SensorChanged イベントが一定のレートで発生するようにするにはどうすればよいですか?
- この場合、Java のクラス TimerTask は役に立ちますか?
ここSOの専門家。助けてください:)