我想使用RxJava在非主线程中调用“ onSensorChanged”方法。
这是我的传感器代码。
public class Accelerometer implements SensorEventListener {
private Sensor linearAccelerSensor;
static PublishSubject<SensorEvent> accelerData = PublishSubject.create();
public static Observable<SensorEvent> getAccelerObservable(){ return accelerData; }
public void initSensor(SensorManager sm){
linearAccelerSensor = sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
sm.registerListener(this,linearAccelerSensor,10000000);
}
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor == linearAccelerSensor){
Log.d("Accelerometer","Acclerometer onSensorchanged");
Log.d("Accelerometer",Thread.currentThread().getName())
accelerData.onNext(event);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
这是我服务的onStartCommand代码。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myCompositeDisposable.add(Accelerometer.getAccelerObservable()
.observeOn(Schedulers.computation())
.subscribeOn(Schedulers.io())
.subscribeWith(new DisposableObserver<SensorEvent>() {
@Override
public void onNext(SensorEvent sensorEvent) {
//textViewAccel.setText(sensorEvent.toString());
Log.d("ServiceAccelerometer",sensorEvent.toString());
lAccX = sensorEvent.values[0];
lAccY = sensorEvent.values[1];
lAccZ = sensorEvent.values[2];
lAccX = Math.round(lAccX*100)/100.0;
lAccY = Math.round(lAccY*100)/100.0;
lAccZ = Math.round(lAccZ*100)/100.0;
double accel = Math.sqrt((lAccX * lAccX) + (lAccY * lAccY) + (lAccZ * lAccZ));
accel = Math.round(accel*100)/100.0;
//textViewAccel.setText(lAccX+" "+lAccY+" "+lAccZ);
Log.d("ServiceAccelerometer",String.valueOf(accel));
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
})
);
return START_NOT_STICKY;
}
实际上,我想在我的Service文件中订阅onSensorChanged()方法。 但是,onSensorChange()方法仅返回void,因此我需要制作另一个返回Observable()的方法。 因此,我使getAccelerObservable()返回了Observable。 但是在此过程中出现了问题。
主线程调用了onSensorChanged方法,因为我订阅了getAccelerObservable()方法。但是,我想在除mainThread之外的其他线程中调用onSensorChanged方法。 我该如何更正我的代码?
答案 0 :(得分:0)
OnSensorChanged不能在除main之外的任何线程上调用。 RxJava甚至无法将其纳入其中-框架调用了该框架,并且该框架未使用RxJava。现在您可以执行的是onSensorChange调用RxJava将数据从主线程推送到另一个线程。这是一个好主意还是会导致崩溃,这取决于您要对传感器结果进行多少工作,以及是否需要随后更新UI。这样做可能会导致更多的延迟和线程之间的抖动。