我已经实现了一个小应用程序,它一次显示加速度计的y值,一次作为原始数据,一次低通滤波。它在一个单独的线程中运行,以保持我的UI响应。
现在在我的用户界面中,当我退出应用程序时,我实现了一个标准的onPause()
方法:
protected void onPause() {
super.onPause();
sensorThread.interrupt();
}
在我的Sensor线程中,我处理中断,但我做错了,因为SensorEventListener不会被注销。这是我的SensorThread:
public class SensorThread extends Thread implements SensorEventListener {
private Context context;
private SensorManager sensorManager;
private Sensor accelerometer;
private long lastUpdate;
private long startTime;
private final float RC = 150.0f;
float accel_y_smoothed = 0.0f;
private Handler handler;
public SensorThread(Context context, Handler handler) {
this.context = context;
this.handler = handler;
}
public void run() {
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
startTime = System.currentTimeMillis();
lastUpdate = System.currentTimeMillis();
}
@Override
public void onSensorChanged(SensorEvent event) {
// Gather Sensor data
if (!Thread.interrupted()) {
float accel_y = event.values[1];
if (System.currentTimeMillis() - lastUpdate > 10) {
// Filter Sensor data
float timeInterval = System.currentTimeMillis() - lastUpdate;
//plot_raw.addValue(accel_y, startTime - System.currentTimeMillis());
float alpha = timeInterval / (RC + timeInterval);
accel_y_smoothed = alpha * accel_y + (1 - alpha) * accel_y_smoothed;
//plot.addValue(accel_y_smoothed, startTime - System.currentTimeMillis());
lastUpdate = System.currentTimeMillis();
Message message = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putFloat("smoothed_y", accel_y_smoothed);
bundle.putFloat("raw_y", accel_y);
bundle.putLong("timestamp", startTime - System.currentTimeMillis());
message.setData(bundle);
handler.sendMessage(message);
}
} else {
stopThread();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
private void stopThread() {
sensorManager.unregisterListener(this);
}
}
当我中断线程时,如何正确取消注册我的SensorEventListener?