Skip to content

Commit 41793e3

Browse files
author
jmhofer
committed
Switched sample from internal clock to using the interval operator
1 parent 37ee2be commit 41793e3

File tree

1 file changed

+22
-45
lines changed

1 file changed

+22
-45
lines changed

rxjava-core/src/main/java/rx/operators/OperationSample.java

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.mockito.Mockito.*;
2121
import static rx.operators.Tester.UnitTest.*;
2222

23+
import java.util.concurrent.Executors;
2324
import java.util.concurrent.TimeUnit;
2425
import java.util.concurrent.atomic.AtomicBoolean;
2526
import java.util.concurrent.atomic.AtomicReference;
@@ -33,7 +34,6 @@
3334
import rx.concurrency.Schedulers;
3435
import rx.subscriptions.Subscriptions;
3536
import rx.util.functions.Action0;
36-
import rx.util.functions.Func0;
3737
import rx.util.functions.Func1;
3838

3939
/**
@@ -45,54 +45,59 @@ public final class OperationSample {
4545
* Samples the observable sequence at each interval.
4646
*/
4747
public static <T> Func1<Observer<T>, Subscription> sample(final Observable<T> source, long interval, TimeUnit unit) {
48-
return new Sample<T>(source, interval, unit);
48+
return new Sample<T>(source, interval, unit, Schedulers.executor(Executors.newSingleThreadScheduledExecutor()));
4949
}
5050

51+
/**
52+
* Samples the observable sequence at each interval.
53+
*/
54+
public static <T> Func1<Observer<T>, Subscription> sample(final Observable<T> source, long interval, TimeUnit unit, Scheduler scheduler) {
55+
return new Sample<T>(source, interval, unit, scheduler);
56+
}
5157
private static class Sample<T> implements Func1<Observer<T>, Subscription> {
5258
private final Observable<T> source;
5359
private final long interval;
5460
private final TimeUnit unit;
61+
private final Scheduler scheduler;
5562

5663
private final AtomicBoolean hasValue = new AtomicBoolean();
5764
private final AtomicReference<T> latestValue = new AtomicReference<T>();
58-
private final AtomicBoolean sourceCompleted = new AtomicBoolean();
5965

60-
private Sample(Observable<T> source, long interval, TimeUnit unit) {
66+
private Sample(Observable<T> source, long interval, TimeUnit unit, Scheduler scheduler) {
6167
this.source = source;
6268
this.interval = interval;
6369
this.unit = unit;
70+
this.scheduler = scheduler;
6471
}
6572

6673
@Override
6774
public Subscription call(final Observer<T> observer) {
68-
Clock clock = new Clock(Schedulers.currentThread(), interval, unit);
69-
final Subscription clockSubscription = Observable.create(clock).subscribe(new Observer<Long>() {
75+
Observable<Long> clock = Observable.create(OperationInterval.interval(interval, unit, scheduler));
76+
final Subscription clockSubscription = clock.subscribe(new Observer<Long>() {
7077
@Override
7178
public void onCompleted() { /* the clock never completes */ }
7279

7380
@Override
7481
public void onError(Exception e) { /* the clock has no errors */ }
7582

7683
@Override
77-
public void onNext(Long totalTimePassed) {
84+
public void onNext(@SuppressWarnings("unused") Long tick) {
7885
if (hasValue.get()) {
7986
observer.onNext(latestValue.get());
8087
}
8188
}
8289
});
8390

84-
Subscription sourceSubscription = source.subscribe(new Observer<T>() {
91+
final Subscription sourceSubscription = source.subscribe(new Observer<T>() {
8592
@Override
8693
public void onCompleted() {
8794
clockSubscription.unsubscribe();
88-
sourceCompleted.set(true);
8995
observer.onCompleted();
9096
}
9197

9298
@Override
9399
public void onError(Exception e) {
94100
clockSubscription.unsubscribe();
95-
sourceCompleted.set(true);
96101
observer.onError(e);
97102
}
98103

@@ -103,41 +108,13 @@ public void onNext(T value) {
103108
}
104109
});
105110

106-
return clockSubscription;
107-
}
108-
109-
private class Clock implements Func1<Observer<Long>, Subscription> {
110-
private final Scheduler scheduler;
111-
private final long interval;
112-
private final TimeUnit unit;
113-
114-
private long timePassed;
115-
116-
private Clock(Scheduler scheduler, long interval, TimeUnit unit) {
117-
this.scheduler = scheduler;
118-
this.interval = interval;
119-
this.unit = unit;
120-
}
121-
122-
@Override
123-
public Subscription call(final Observer<Long> observer) {
124-
return scheduler.schedule(new Func0<Subscription>() {
125-
@Override
126-
public Subscription call() {
127-
if (! sourceCompleted.get()) {
128-
timePassed += interval;
129-
observer.onNext(timePassed);
130-
return Clock.this.call(observer);
131-
}
132-
return Subscriptions.create(new Action0() {
133-
@Override
134-
public void call() {
135-
// TODO Auto-generated method stub
136-
}
137-
});
138-
}
139-
}, interval, unit);
140-
}
111+
return Subscriptions.create(new Action0() {
112+
@Override
113+
public void call() {
114+
clockSubscription.unsubscribe();
115+
sourceSubscription.unsubscribe();
116+
}
117+
});
141118
}
142119
}
143120

0 commit comments

Comments
 (0)