如何在线程中取消注册SensorEventListener?

时间:2015-11-08 17:29:48

标签: java android multithreading

我已经实现了一个小应用程序,它一次显示加速度计的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?

0 个答案:

没有答案