2020import rx .Observer ;
2121import rx .Subscription ;
2222import rx .subscriptions .CompositeSubscription ;
23- import rx .subscriptions .MultipleAssignmentSubscription ;
23+ import rx .subscriptions .SerialSubscription ;
2424import rx .util .functions .Func1 ;
2525
2626/**
@@ -62,8 +62,7 @@ public Subscription onSubscribe(Observer<? super T> observer) {
6262 SafeObservableSubscription parent ;
6363 parent = new SafeObservableSubscription ();
6464
65- MultipleAssignmentSubscription child ;
66- child = new MultipleAssignmentSubscription ();
65+ SerialSubscription child = new SerialSubscription ();
6766
6867 parent .wrap (sequences .subscribe (new SwitchObserver <T >(observer , parent , child )));
6968
@@ -76,13 +75,13 @@ private static class SwitchObserver<T> implements Observer<Observable<? extends
7675 private final Object gate ;
7776 private final Observer <? super T > observer ;
7877 private final SafeObservableSubscription parent ;
79- private final MultipleAssignmentSubscription child ;
78+ private final SerialSubscription child ;
8079 private long latest ;
8180 private boolean stopped ;
8281 private boolean hasLatest ;
8382
8483 public SwitchObserver (Observer <? super T > observer , SafeObservableSubscription parent ,
85- MultipleAssignmentSubscription child ) {
84+ SerialSubscription child ) {
8685 this .observer = observer ;
8786 this .parent = parent ;
8887 this .child = child ;
@@ -97,8 +96,7 @@ public void onNext(Observable<? extends T> args) {
9796 this .hasLatest = true ;
9897 }
9998
100- final SafeObservableSubscription sub ;
101- sub = new SafeObservableSubscription ();
99+ final SafeObservableSubscription sub = new SafeObservableSubscription ();
102100 sub .wrap (args .subscribe (new Observer <T >() {
103101 @ Override
104102 public void onNext (T args ) {
@@ -111,28 +109,35 @@ public void onNext(T args) {
111109
112110 @ Override
113111 public void onError (Throwable e ) {
112+ sub .unsubscribe ();
113+ SafeObservableSubscription s = null ;
114114 synchronized (gate ) {
115- sub .unsubscribe ();
116115 if (latest == id ) {
117116 SwitchObserver .this .observer .onError (e );
118- SwitchObserver .this .parent . unsubscribe () ;
117+ s = SwitchObserver .this .parent ;
119118 }
120119 }
120+ if (s != null ) {
121+ s .unsubscribe ();
122+ }
121123 }
122124
123125 @ Override
124126 public void onCompleted () {
127+ sub .unsubscribe ();
128+ SafeObservableSubscription s = null ;
125129 synchronized (gate ) {
126- sub .unsubscribe ();
127130 if (latest == id ) {
128131 SwitchObserver .this .hasLatest = false ;
129- }
130132
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+ }
134137 }
135-
138+ }
139+ if (s != null ) {
140+ s .unsubscribe ();
136141 }
137142 }
138143
@@ -152,13 +157,17 @@ public void onError(Throwable e) {
152157
153158 @ Override
154159 public void onCompleted () {
160+ SafeObservableSubscription s = null ;
155161 synchronized (gate ) {
156162 this .stopped = true ;
157163 if (!this .hasLatest ) {
158164 this .observer .onCompleted ();
159- this .parent . unsubscribe () ;
165+ s = this .parent ;
160166 }
161167 }
168+ if (s != null ) {
169+ s .unsubscribe ();
170+ }
162171 }
163172
164173 }
0 commit comments