Я хочу вызвать метод "onSensorChanged" в неосновном потоке с использованием RxJava.
Вот мой код датчика.
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;
}
На самом деле я хотел подписать метод onSensorChanged () в моем файле службы.Однако метод onSensorChange () вернул только void, поэтому мне нужно создать другой метод, который возвращает Observable ().Поэтому я сделал getAccelerObservable (), который возвращает Observable.Но в этом процессе возникла проблема.
Метод onSensorChanged был вызван основным потоком, потому что я подписался на метод getAccelerObservable ().Однако я хочу вызвать метод onSensorChanged в другом потоке, за исключением mainThread.Как я могу исправить свой код?