OnSensorChanged线程

时间:2014-04-11 12:31:02

标签: java android multithreading service android-sensors

我需要在方法onSensorChanged上做很多工作,所以我的应用程序正在冻结。 我试图在方法OnSensorChanged中创建线程。它有点帮助但每次创建多次新线程并不是我认为最好的方法。我该怎么办?

我创建了自己的sensorService,它扩展了Service并实现了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);
    }
}

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

2 个答案:

答案 0 :(得分:1)

看起来你的线程只是处理某种类型的事件并在线程中执行一些expensiveWork()。作为一个事件,我认为它应该以FIFO(先入先出)的方式处理。

因此,如果按FIFO顺序处理,您可以将其作为事件队列,并且线程的run()方法将继续从队列中选择事件。如果没有事件,你的线程将继续等待你的主线程保持一个新事件并发出信号。

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

如果FIFO顺序无关紧要,您可以使用ThreadPool生成多个线程,该线程将继续接收事件并并行执行。

答案 1 :(得分:0)

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

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);     
}