@@ -45,17 +45,51 @@ public final class OperatorOnErrorResumeNextViaFunction<T> implements Operator<T
45
45
46
46
final Func1 <Throwable , ? extends Observable <? extends T >> resumeFunction ;
47
47
48
+ public static <T > OperatorOnErrorResumeNextViaFunction <T > withSingle (final Func1 <Throwable , ? extends T > resumeFunction ) {
49
+ return new OperatorOnErrorResumeNextViaFunction <T >(new Func1 <Throwable , Observable <? extends T >>() {
50
+ @ Override
51
+ public Observable <? extends T > call (Throwable t ) {
52
+ return Observable .just (resumeFunction .call (t ));
53
+ }
54
+ });
55
+ }
56
+
57
+ public static <T > OperatorOnErrorResumeNextViaFunction <T > withOther (final Observable <? extends T > other ) {
58
+ return new OperatorOnErrorResumeNextViaFunction <T >(new Func1 <Throwable , Observable <? extends T >>() {
59
+ @ Override
60
+ public Observable <? extends T > call (Throwable t ) {
61
+ return other ;
62
+ }
63
+ });
64
+ }
65
+
66
+ public static <T > OperatorOnErrorResumeNextViaFunction <T > withException (final Observable <? extends T > other ) {
67
+ return new OperatorOnErrorResumeNextViaFunction <T >(new Func1 <Throwable , Observable <? extends T >>() {
68
+ @ Override
69
+ public Observable <? extends T > call (Throwable t ) {
70
+ if (t instanceof Exception ) {
71
+ return other ;
72
+ }
73
+ return Observable .error (t );
74
+ }
75
+ });
76
+ }
77
+
48
78
public OperatorOnErrorResumeNextViaFunction (Func1 <Throwable , ? extends Observable <? extends T >> f ) {
49
79
this .resumeFunction = f ;
50
80
}
51
81
52
82
@ Override
53
83
public Subscriber <? super T > call (final Subscriber <? super T > child ) {
54
84
final ProducerArbiter pa = new ProducerArbiter ();
85
+
55
86
final SerialSubscription ssub = new SerialSubscription ();
87
+
56
88
Subscriber <T > parent = new Subscriber <T >() {
57
89
58
- private boolean done = false ;
90
+ private boolean done ;
91
+
92
+ long produced ;
59
93
60
94
@ Override
61
95
public void onCompleted () {
@@ -70,12 +104,13 @@ public void onCompleted() {
70
104
public void onError (Throwable e ) {
71
105
if (done ) {
72
106
Exceptions .throwIfFatal (e );
107
+ RxJavaPlugins .getInstance ().getErrorHandler ().handleError (e );
73
108
return ;
74
109
}
75
110
done = true ;
76
111
try {
77
- RxJavaPlugins .getInstance ().getErrorHandler ().handleError (e );
78
112
unsubscribe ();
113
+
79
114
Subscriber <T > next = new Subscriber <T >() {
80
115
@ Override
81
116
public void onNext (T t ) {
@@ -96,7 +131,13 @@ public void setProducer(Producer producer) {
96
131
};
97
132
ssub .set (next );
98
133
134
+ long p = produced ;
135
+ if (p != 0L ) {
136
+ pa .produced (p );
137
+ }
138
+
99
139
Observable <? extends T > resume = resumeFunction .call (e );
140
+
100
141
resume .unsafeSubscribe (next );
101
142
} catch (Throwable e2 ) {
102
143
Exceptions .throwOrReport (e2 , child );
@@ -108,6 +149,7 @@ public void onNext(T t) {
108
149
if (done ) {
109
150
return ;
110
151
}
152
+ produced ++;
111
153
child .onNext (t );
112
154
}
113
155
@@ -117,9 +159,11 @@ public void setProducer(final Producer producer) {
117
159
}
118
160
119
161
};
120
- child .add (ssub );
121
162
ssub .set (parent );
163
+
164
+ child .add (ssub );
122
165
child .setProducer (pa );
166
+
123
167
return parent ;
124
168
}
125
169
0 commit comments