Java OnSensorChanged螺纹

Java OnSensorChanged螺纹,java,android,multithreading,service,android-sensors,Java,Android,Multithreading,Service,Android Sensors,我需要在SensorChanged方法中做很多工作,这样我的应用程序就冻结了。 我试图在方法OnSensorChanged中创建线程。这有点帮助,但我认为每秒钟创建许多新线程并不是最好的方法。我该怎么办 我创建了自己的sensorService,它扩展了服务并实现了SensorEventListener @Override public void onSensorChanged(SensorEvent event) { Thread w = new Thread(new Worker(e

我需要在SensorChanged方法中做很多工作,这样我的应用程序就冻结了。 我试图在方法OnSensorChanged中创建线程。这有点帮助,但我认为每秒钟创建许多新线程并不是最好的方法。我该怎么办

我创建了自己的sensorService,它扩展了服务并实现了SensorEventListener

@Override
public void onSensorChanged(SensorEvent event) {
    Thread w = new Thread(new Worker(event));
    w.start();

}

class Worker implements Runnable{
    SensorEvent event;
    Worker(SensorEvent event){
        this.event=event;
    }
    @Override
    public void run() {
        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
            accelerometerData(event);
        }
        if(event.sensor.getType()==Sensor.TYPE_GRAVITY){
            gravityData(event);
        }
        if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION){
            linearAccelerometerData(event);
        }
    }
    private void linearAccelerometerData(SensorEvent event) {
        expensiveWork();
        Intent intent = new Intent("SensorService");
        intent.putExtra("data",data)            LocalBroadcastManager.getInstance(SensorService.this).sendBroadcast(intent);
    }

    private void accelerometerData(SensorEvent event){  
        expensiveWork2();
        Intent intent = new Intent("SensorService");
        intent.putExtra("data",data)    
        LocalBroadcastManager.getInstance(SensorService.this).sendBroadcast(intent);
    }
}

我可以在它自己的线程上启动服务吗?或者只创建一个线程并将工作交给他?

看起来您的线程只是在处理某种类型的事件,并在线程中执行一些开销工作()。作为一项活动,我认为应该以先进先出的方式处理

所以,如果它是按FIFO顺序处理的,您可以将其作为事件队列,线程的
run()
方法将继续从队列中拾取事件。如果没有事件,线程将继续等待主线程保存新事件并发出信号

这是一个理想的生产者-消费者问题,主线程将继续向队列中添加事件,而工作线程将继续逐个消费这些事件。您应该考虑最佳队列大小等


如果FIFO顺序不重要,您可以使用ThreadPool生成多个线程,这些线程将继续接收事件并并行执行。

您应该向处理程序注册侦听器

public boolean registerListener (SensorEventListener listener, Sensor sensor, int rateUs, Handler handler)
比如说

// Class members
private HandlerThread mSensorThread;
private Handler mHandler;
onCreate中

mSensorThread = new HandlerThread("sensor_thread"); //$NON-NLS-1$
mSensorThread.start();
mHandler = new Handler(mSensorThread.getLooper());
....
Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (sensor != null)
{
    mSensorManager.registerListener(this, sensor, your_desired_rate, mHandler);     
}

您的事件应该如何处理,即以FIFO顺序或任何顺序都可以?一个服务作为它自己的线程,因此从这个角度来看没有问题,关于线程,FIFO如何使用UI线程编写,您的工作人员将如何阅读it@sakura如果当前更新的处理尚未完成,您必须能够删除到达的更新,或者你需要处理每一个传感器更新?@Salauyou每一个传感器更新。但是如何阻止工作线程呢?我猜想信号灯在哪里。如何在java中实现这一点?您可以找到数千个链接,其中显示了一个典型的生产者-消费者问题及其解决方案的示例。试着用谷歌搜索一下,如果你想不出什么,再到这里来。哪个线程在SensorChanged上运行?我认为onSensorChanged()是由listerner的线程调用的,并且listener是“this”(服务),即使您无法从服务更新UI,它仍然在主线程上运行。阅读下面的第二段