aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/src/cgeo/geocaching/CgeoApplication.java4
-rw-r--r--main/src/cgeo/geocaching/utils/RxUtils.java19
2 files changed, 21 insertions, 2 deletions
diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java
index 8822fe8..a60efaa 100644
--- a/main/src/cgeo/geocaching/CgeoApplication.java
+++ b/main/src/cgeo/geocaching/CgeoApplication.java
@@ -101,7 +101,7 @@ public class CgeoApplication extends Application {
gpsStatusObservable = GpsStatusProvider.create(this).replay(1).refCount();
// Attempt to acquire an initial location before any real activity happens.
- geoDataObservableLowPower.subscribeOn(RxUtils.looperCallbacksScheduler).first().subscribe(rememberGeodataAction);
+ geoDataObservableLowPower.subscribeOn(RxUtils.looperCallbacksScheduler).first().subscribe();
}
public void setupGeoDataObservables(final boolean useGooglePlayServices, final boolean useLowPowerLocation) {
@@ -113,7 +113,7 @@ public class CgeoApplication extends Application {
geoDataObservableLowPower = geoDataObservable;
}
} else {
- geoDataObservable = GeoDataProvider.create(this).doOnNext(rememberGeodataAction).replay(1).refCount();
+ geoDataObservable = RxUtils.rememberLast(GeoDataProvider.create(this).doOnNext(rememberGeodataAction));
geoDataObservableLowPower = geoDataObservable;
}
}
diff --git a/main/src/cgeo/geocaching/utils/RxUtils.java b/main/src/cgeo/geocaching/utils/RxUtils.java
index 670c38c..ec8f7b8 100644
--- a/main/src/cgeo/geocaching/utils/RxUtils.java
+++ b/main/src/cgeo/geocaching/utils/RxUtils.java
@@ -8,6 +8,8 @@ import rx.Scheduler.Worker;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
+import rx.functions.Action1;
+import rx.functions.Func0;
import rx.functions.Func1;
import rx.observables.BlockingObservable;
import rx.observers.Subscribers;
@@ -24,6 +26,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
public class RxUtils {
@@ -150,4 +153,20 @@ public class RxUtils {
};
}
+ public static<T> Observable<T> rememberLast(final Observable<T> observable) {
+ final AtomicReference<T> lastValue = new AtomicReference<>(null);
+ return observable.doOnNext(new Action1<T>() {
+ @Override
+ public void call(final T value) {
+ lastValue.set(value);
+ }
+ }).startWith(Observable.defer(new Func0<Observable<T>>() {
+ @Override
+ public Observable<T> call() {
+ final T last = lastValue.get();
+ return last != null ? Observable.just(last) : Observable.<T>empty();
+ }
+ })).replay(1).refCount();
+ }
+
}