我需要在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);
}
}
我可以在其自己的线程上启动服务吗?还是只创建一个线程并给他工作?
最佳答案
您应该向处理程序注册监听器
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);
}
关于java - OnSensorChanged线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23012639/