加速度传感器在单独线程中的处理

4

我正在将加速度传感器的数据保存到数据库中,但我想在单独的线程中执行此操作。我尝试在互联网上搜索,但大多数示例都使用相同的线程。

我尝试的方法:

SenSorEventListener sel;
    Thread A=new Thread(){
                public void run()
                {
                    sel=new SensorEventListener() {

                        @Override
                        public void onSensorChanged(SensorEvent event) {
                            // TODO Auto-generated method stub
                            double Acceleration,x,y,z;
                            x=event.values[0];
                            y=event.values[2];
                            z=event.values[2];
                            Acceleration=Math.sqrt(x*x+y*y+z*z);
                            db.addAccel(Acceleration);
                            Log.d("MESSAGE","SAVED");
                        }

                        @Override
                        public void onAccuracyChanged(Sensor sensor, int accuracy) {
                            // TODO Auto-generated method stub

                        }
                    };
                }
            };
            A.start();
            try {
                A.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sm.registerListener(sel,s,1000000);
}

我使用了SensorEventListener,将其初始化在一个新的线程中,然后使用register listener进行注册。
另一种方法是:我使用了实现Runnable接口的Accelerometer类,在构造函数中初始化所有内容,因此我的run()方法为空,但这种方法不会创建新的线程。
    Accelerometer(Context con,Database d)
        {   
            sm=(SensorManager)con.getSystemService(Context.SENSOR_SERVICE);
            s=sm.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
            sm.registerListener(this,s,1000000);
            db=d;
        }
   void run()
   {}

我很乐意尝试另一种方法,或者听到我在上述方法中做错了什么。

1个回答

10

首先,您需要使用registerListener(SensorEventListener listener, Sensor sensor, int rate, Handler handler)方法,并提供一个在后台线程上运行的Handler

创建一个HandlerThread,获取它的Looper,创建一个提供该looper的Handler

这将允许您在后台线程上接收回调。完成后,请确保删除侦听器,然后调用Looper.quit()退出线程。


为了退出,我们是调用 Looper.quit() 还是 HandlerThread 实例,比如 handlerThread.quit() - Omri374
HandlerThread.quit() 将在其所持有的 Looper 引用上调用 Looper.quit()。HandlerThread.quit() 函数是在较新的 API 中添加的。 - techi.services

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接