diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-10-24 12:24:17 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-10-24 12:24:17 +0200 |
| commit | 66bfe5b111d0921a8647fa323cfa01599c4b8aa0 (patch) | |
| tree | a08c5e54f58afb06a362c53dd78cf79f87ffdc34 | |
| parent | 43eafe0b3a63cd37ebb1b21d248b47034e4bc3e9 (diff) | |
| download | cgeo-66bfe5b111d0921a8647fa323cfa01599c4b8aa0.zip cgeo-66bfe5b111d0921a8647fa323cfa01599c4b8aa0.tar.gz cgeo-66bfe5b111d0921a8647fa323cfa01599c4b8aa0.tar.bz2 | |
Remove a potential race condition
5 files changed, 27 insertions, 10 deletions
diff --git a/main/src/cgeo/geocaching/sensors/GeoDataProvider.java b/main/src/cgeo/geocaching/sensors/GeoDataProvider.java index faecbe3..837a17a 100644 --- a/main/src/cgeo/geocaching/sensors/GeoDataProvider.java +++ b/main/src/cgeo/geocaching/sensors/GeoDataProvider.java @@ -45,7 +45,7 @@ public class GeoDataProvider extends LooperCallbacks<IGeoData> { public void onStart() { final IGeoData initialLocation = GeoData.getInitialLocation(context); if (initialLocation != null) { - subscriber.onNext(initialLocation); + subject.onNext(initialLocation); } Log.d("GeoDataProvider: starting the GPS and network listeners"); try { @@ -98,7 +98,7 @@ public class GeoDataProvider extends LooperCallbacks<IGeoData> { private void assign(final Location location) { // We do not necessarily get signalled when satellites go to 0/0. final IGeoData current = new GeoData(location); - subscriber.onNext(current); + subject.onNext(current); } } diff --git a/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java b/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java index 5f12e99..d7aa113 100644 --- a/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java +++ b/main/src/cgeo/geocaching/sensors/GpsStatusProvider.java @@ -50,7 +50,7 @@ public class GpsStatusProvider extends LooperCallbacks<Status> { @Override protected void onStart() { Log.d("GpsStatusProvider: starting the GPS status listener"); - subscriber.onNext(NO_GPS); + subject.onNext(NO_GPS); geoManager.addGpsStatusListener(gpsStatusListener); } @@ -92,7 +92,7 @@ public class GpsStatusProvider extends LooperCallbacks<Status> { throw new IllegalStateException(); } - subscriber.onNext(latest); + subject.onNext(latest); } } diff --git a/main/src/cgeo/geocaching/sensors/OrientationProvider.java b/main/src/cgeo/geocaching/sensors/OrientationProvider.java index 83e0638..2816296 100644 --- a/main/src/cgeo/geocaching/sensors/OrientationProvider.java +++ b/main/src/cgeo/geocaching/sensors/OrientationProvider.java @@ -29,7 +29,7 @@ public class OrientationProvider extends LooperCallbacks<Float> implements Senso @Override public void onSensorChanged(final SensorEvent event) { - subscriber.onNext(event.values[0]); + subject.onNext(event.values[0]); } @Override @@ -48,7 +48,7 @@ public class OrientationProvider extends LooperCallbacks<Float> implements Senso Log.d("OrientationProvider: starting the orientation provider"); sensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL); } else { - subscriber.onError(new RuntimeException("orientation sensor is absent on this device")); + subject.onError(new RuntimeException("orientation sensor is absent on this device")); } } diff --git a/main/src/cgeo/geocaching/sensors/RotationProvider.java b/main/src/cgeo/geocaching/sensors/RotationProvider.java index 40e2c3c..09fac00 100644 --- a/main/src/cgeo/geocaching/sensors/RotationProvider.java +++ b/main/src/cgeo/geocaching/sensors/RotationProvider.java @@ -51,7 +51,7 @@ public class RotationProvider extends LooperCallbacks<Float> implements SensorEv SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values); } SensorManager.getOrientation(rotationMatrix, orientation); - subscriber.onNext((float) (orientation[0] * 180 / Math.PI)); + subject.onNext((float) (orientation[0] * 180 / Math.PI)); } @Override @@ -64,7 +64,7 @@ public class RotationProvider extends LooperCallbacks<Float> implements SensorEv Log.d("RotationProvider: starting the rotation provider"); sensorManager.registerListener(this, rotationSensor, SensorManager.SENSOR_DELAY_NORMAL); } else { - subscriber.onError(new RuntimeException("rotation sensor is absent on this device")); + subject.onError(new RuntimeException("rotation sensor is absent on this device")); } } diff --git a/main/src/cgeo/geocaching/utils/RxUtils.java b/main/src/cgeo/geocaching/utils/RxUtils.java index 8bbbbf0..4845b6a 100644 --- a/main/src/cgeo/geocaching/utils/RxUtils.java +++ b/main/src/cgeo/geocaching/utils/RxUtils.java @@ -8,9 +8,11 @@ import rx.Scheduler.Worker; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; +import rx.functions.Action1; import rx.functions.Func1; import rx.observables.BlockingObservable; import rx.schedulers.Schedulers; +import rx.subjects.PublishSubject; import rx.subscriptions.Subscriptions; import android.os.Handler; @@ -62,7 +64,7 @@ public class RxUtils { final AtomicInteger counter = new AtomicInteger(0); final long stopDelay; final TimeUnit stopDelayUnit; - protected Subscriber<? super T> subscriber; + final protected PublishSubject<T> subject = PublishSubject.create(); public LooperCallbacks(final long stopDelay, final TimeUnit stopDelayUnit) { this.stopDelay = stopDelay; @@ -75,7 +77,22 @@ public class RxUtils { @Override final public void call(final Subscriber<? super T> subscriber) { - this.subscriber = subscriber; + subscriber.add(subject.subscribe(new Action1<T>() { + @Override + public void call(final T data) { + subscriber.onNext(data); + } + }, new Action1<Throwable>() { + @Override + public void call(final Throwable throwable) { + subscriber.onError(throwable); + } + }, new Action0() { + @Override + public void call() { + subscriber.onCompleted(); + } + })); looperCallbacksWorker.schedule(new Action0() { @Override public void call() { |
