1919import java .util .NoSuchElementException ;
2020import java .util .concurrent .ArrayBlockingQueue ;
2121import java .util .concurrent .BlockingQueue ;
22+ import java .util .concurrent .atomic .AtomicBoolean ;
2223import java .util .concurrent .atomic .AtomicIntegerFieldUpdater ;
2324
2425import rx .Notification ;
@@ -46,11 +47,7 @@ public static <T> Iterable<T> next(final Observable<? extends T> items) {
4647 @ Override
4748 public Iterator <T > iterator () {
4849 NextObserver <T > nextObserver = new NextObserver <T >();
49- final NextIterator <T > nextIterator = new NextIterator <T >(nextObserver );
50-
51- items .materialize ().subscribe (nextObserver );
52-
53- return nextIterator ;
50+ return new NextIterator <T >(items , nextObserver );
5451 }
5552 };
5653
@@ -59,28 +56,19 @@ public Iterator<T> iterator() {
5956 // test needs to access the observer.waiting flag non-blockingly.
6057 /* private */ static final class NextIterator <T > implements Iterator <T > {
6158
62- private final NextObserver <? extends T > observer ;
59+ private final NextObserver <T > observer ;
60+ private final Observable <? extends T > items ;
6361 private T next ;
6462 private boolean hasNext = true ;
6563 private boolean isNextConsumed = true ;
6664 private Throwable error = null ;
65+ private boolean started = false ;
6766
68- private NextIterator (NextObserver <? extends T > observer ) {
67+ private NextIterator (Observable <? extends T > items , NextObserver <T > observer ) {
68+ this .items = items ;
6969 this .observer = observer ;
7070 }
7171
72-
73- // in tests, set the waiting flag without blocking for the next value to
74- // allow lockstepping instead of multi-threading
75- /**
76- * In tests, set the waiting flag without blocking for the next value to
77- * allow lockstepping instead of multi-threading
78- * @param value use 1 to enter into the waiting state
79- */
80- void setWaiting (int value ) {
81- observer .setWaiting (value );
82- }
83-
8472 @ Override
8573 public boolean hasNext () {
8674 if (error != null ) {
@@ -102,6 +90,13 @@ public boolean hasNext() {
10290
10391 private boolean moveToNext () {
10492 try {
93+ if (!started ) {
94+ started = true ;
95+ // if not started, start now
96+ observer .setWaiting (1 );
97+ items .materialize ().subscribe (observer );
98+ }
99+
105100 Notification <? extends T > nextNotification = observer .takeNext ();
106101 if (nextNotification .isOnNext ()) {
107102 isNextConsumed = false ;
0 commit comments