我需要在方法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);
}
}
我可以在自己的线程上启动服务吗?或者只创建一个线程并给他工作?
答案 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);
}