Java 如何在线程中注销SensorEventListener?
我已经实现了一个小应用程序,显示我的加速计的y值,一次作为原始数据,一次低通滤波。它在一个单独的线程中运行,以保持我的UI响应 现在在我的UI中,当我退出应用程序时,我实现了一个标准的Java 如何在线程中注销SensorEventListener?,java,android,multithreading,Java,Android,Multithreading,我已经实现了一个小应用程序,显示我的加速计的y值,一次作为原始数据,一次低通滤波。它在一个单独的线程中运行,以保持我的UI响应 现在在我的UI中,当我退出应用程序时,我实现了一个标准的onPause()方法: protected void onPause() { super.onPause(); sensorThread.interrupt(); } 在我的Sensor线程中,我处理中断,但我做了一些错误的事情,因为SensorEventListener不会被注销。以下是我的感
onPause()
方法:
protected void onPause() {
super.onPause();
sensorThread.interrupt();
}
在我的Sensor线程中,我处理中断,但我做了一些错误的事情,因为SensorEventListener不会被注销。以下是我的感受线程:
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?只是一个想法。。。Handler Handler=新处理程序(Looper.getMainLooper());handler.post(new Runnable(){这是我在后台处理GUI内容时使用的代码,我可以想象这也可以做到这一点…@MartinPfeffer谢谢你的这个想法。如果这可行,我会试试。不过,我仍然对我的版本的合适解决方案感兴趣;)很好,请让我知道它是否有效。:)只是一个想法…Handler Handler=new Handler(Looper.getMainLooper());Handler.post(new Runnable()){这是我在后台做GUI工作时使用的代码,我可以想象这也可以做到这一点…@MartinPfeffer谢谢你的想法。我会试试看是否可行。不过,我仍然对适合我的版本的解决方案感兴趣;)很好,请告诉我是否可行。:)