20
20
import rx .Observer ;
21
21
import rx .Subscription ;
22
22
import rx .subscriptions .CompositeSubscription ;
23
- import rx .subscriptions .MultipleAssignmentSubscription ;
23
+ import rx .subscriptions .SerialSubscription ;
24
24
import rx .util .functions .Func1 ;
25
25
26
26
/**
@@ -62,8 +62,7 @@ public Subscription onSubscribe(Observer<? super T> observer) {
62
62
SafeObservableSubscription parent ;
63
63
parent = new SafeObservableSubscription ();
64
64
65
- MultipleAssignmentSubscription child ;
66
- child = new MultipleAssignmentSubscription ();
65
+ SerialSubscription child = new SerialSubscription ();
67
66
68
67
parent .wrap (sequences .subscribe (new SwitchObserver <T >(observer , parent , child )));
69
68
@@ -76,13 +75,13 @@ private static class SwitchObserver<T> implements Observer<Observable<? extends
76
75
private final Object gate ;
77
76
private final Observer <? super T > observer ;
78
77
private final SafeObservableSubscription parent ;
79
- private final MultipleAssignmentSubscription child ;
78
+ private final SerialSubscription child ;
80
79
private long latest ;
81
80
private boolean stopped ;
82
81
private boolean hasLatest ;
83
82
84
83
public SwitchObserver (Observer <? super T > observer , SafeObservableSubscription parent ,
85
- MultipleAssignmentSubscription child ) {
84
+ SerialSubscription child ) {
86
85
this .observer = observer ;
87
86
this .parent = parent ;
88
87
this .child = child ;
@@ -97,8 +96,7 @@ public void onNext(Observable<? extends T> args) {
97
96
this .hasLatest = true ;
98
97
}
99
98
100
- final SafeObservableSubscription sub ;
101
- sub = new SafeObservableSubscription ();
99
+ final SafeObservableSubscription sub = new SafeObservableSubscription ();
102
100
sub .wrap (args .subscribe (new Observer <T >() {
103
101
@ Override
104
102
public void onNext (T args ) {
@@ -111,28 +109,35 @@ public void onNext(T args) {
111
109
112
110
@ Override
113
111
public void onError (Throwable e ) {
112
+ sub .unsubscribe ();
113
+ SafeObservableSubscription s = null ;
114
114
synchronized (gate ) {
115
- sub .unsubscribe ();
116
115
if (latest == id ) {
117
116
SwitchObserver .this .observer .onError (e );
118
- SwitchObserver .this .parent . unsubscribe () ;
117
+ s = SwitchObserver .this .parent ;
119
118
}
120
119
}
120
+ if (s != null ) {
121
+ s .unsubscribe ();
122
+ }
121
123
}
122
124
123
125
@ Override
124
126
public void onCompleted () {
127
+ sub .unsubscribe ();
128
+ SafeObservableSubscription s = null ;
125
129
synchronized (gate ) {
126
- sub .unsubscribe ();
127
130
if (latest == id ) {
128
131
SwitchObserver .this .hasLatest = false ;
129
- }
130
132
131
- if (stopped ) {
132
- SwitchObserver .this .observer .onCompleted ();
133
- SwitchObserver .this .parent .unsubscribe ();
133
+ if (stopped ) {
134
+ SwitchObserver .this .observer .onCompleted ();
135
+ s = SwitchObserver .this .parent ;
136
+ }
134
137
}
135
-
138
+ }
139
+ if (s != null ) {
140
+ s .unsubscribe ();
136
141
}
137
142
}
138
143
@@ -152,13 +157,17 @@ public void onError(Throwable e) {
152
157
153
158
@ Override
154
159
public void onCompleted () {
160
+ SafeObservableSubscription s = null ;
155
161
synchronized (gate ) {
156
162
this .stopped = true ;
157
163
if (!this .hasLatest ) {
158
164
this .observer .onCompleted ();
159
- this .parent . unsubscribe () ;
165
+ s = this .parent ;
160
166
}
161
167
}
168
+ if (s != null ) {
169
+ s .unsubscribe ();
170
+ }
162
171
}
163
172
164
173
}
0 commit comments