aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-10-24 12:24:17 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-10-24 12:24:17 +0200
commit66bfe5b111d0921a8647fa323cfa01599c4b8aa0 (patch)
treea08c5e54f58afb06a362c53dd78cf79f87ffdc34
parent43eafe0b3a63cd37ebb1b21d248b47034e4bc3e9 (diff)
downloadcgeo-66bfe5b111d0921a8647fa323cfa01599c4b8aa0.zip
cgeo-66bfe5b111d0921a8647fa323cfa01599c4b8aa0.tar.gz
cgeo-66bfe5b111d0921a8647fa323cfa01599c4b8aa0.tar.bz2
Remove a potential race condition
-rw-r--r--main/src/cgeo/geocaching/sensors/GeoDataProvider.java4
-rw-r--r--main/src/cgeo/geocaching/sensors/GpsStatusProvider.java4
-rw-r--r--main/src/cgeo/geocaching/sensors/OrientationProvider.java4
-rw-r--r--main/src/cgeo/geocaching/sensors/RotationProvider.java4
-rw-r--r--main/src/cgeo/geocaching/utils/RxUtils.java21
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() {