Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在线程中注销SensorEventListener?_Java_Android_Multithreading - Fatal编程技术网

Java 如何在线程中注销SensorEventListener?

Java 如何在线程中注销SensorEventListener?,java,android,multithreading,Java,Android,Multithreading,我已经实现了一个小应用程序,显示我的加速计的y值,一次作为原始数据,一次低通滤波。它在一个单独的线程中运行,以保持我的UI响应 现在在我的UI中,当我退出应用程序时,我实现了一个标准的onPause()方法: protected void onPause() { super.onPause(); sensorThread.interrupt(); } 在我的Sensor线程中,我处理中断,但我做了一些错误的事情,因为SensorEventListener不会被注销。以下是我的感

我已经实现了一个小应用程序,显示我的加速计的y值,一次作为原始数据,一次低通滤波。它在一个单独的线程中运行,以保持我的UI响应

现在在我的UI中,当我退出应用程序时,我实现了一个标准的
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谢谢你的想法。我会试试看是否可行。不过,我仍然对适合我的版本的解决方案感兴趣;)很好,请告诉我是否可行。:)