@Test public void shouldRemoveCallbacksFromHandlerWhenUnsubscribedSubscription() { Handler handler = spy(new Handler()); Observable.OnSubscribe<Integer> onSubscribe = mock(Observable.OnSubscribe.class); Subscription subscription = Observable.create(onSubscribe) .subscribeOn(AndroidSchedulers.from(handler)) .subscribe(); verify(onSubscribe).call(any(Subscriber.class)); subscription.unsubscribe(); verify(handler).removeCallbacks(any(Runnable.class)); }
@Test public void shouldNotCallOnSubscribeWhenSubscriptionUnsubscribedBeforeDelay() { Observable.OnSubscribe<Integer> onSubscribe = mock(Observable.OnSubscribe.class); Handler handler = spy(new Handler()); final Worker worker = spy(new HandlerScheduler.HandlerWorker(handler)); Scheduler scheduler = new Scheduler() { @Override public Worker createWorker() { return worker; } }; Subscription subscription = Observable.create(onSubscribe) .delaySubscription(1, MINUTES, scheduler) .subscribe(); verify(worker).schedule(any(Action0.class), eq(1L), eq(MINUTES)); verify(handler).postDelayed(any(Runnable.class), eq(MINUTES.toMillis(1))); subscription.unsubscribe(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); verify(onSubscribe, never()).call(any(Subscriber.class)); verify(handler).removeCallbacks(any(Runnable.class)); } }
@Override public <T> Observable.OnSubscribe<T> onSubscribeStart(Observable<? extends T> observableInstance, final Observable.OnSubscribe<T> onSubscribe) { int activeSubscriptionCount = subscriptions.incrementAndGet(); if (logEnabled) { Log.d(TAG, onSubscribe + " - onSubscribeStart: " + activeSubscriptionCount, new Throwable()); } onSubscribe.call(new Subscriber<T>() { @Override public void onCompleted() { onFinally(onSubscribe, "onCompleted"); } @Override public void onError(Throwable e) { onFinally(onSubscribe, "onError"); } @Override public void onNext(T t) { //nothing } }); return onSubscribe; }
hook.onSubscribeStart(this, onSubscribe).call(subscriber); return hook.onSubscribeReturn(subscriber); } catch (Throwable e) {
hook.onSubscribeStart(this, onSubscribe).call(subscriber); return hook.onSubscribeReturn(subscriber); } catch (Throwable e) {
@Override public void call(Subscriber<? super R> o) { try { Subscriber<? super T> st = hook.onLift(lift).call(o); // new Subscriber created and being subscribed with so 'onStart' it st.onStart(); onSubscribe.call(st); } catch (Throwable e) { // localized capture of errors rather than it skipping all operators // and ending up in the try/catch of the subscribe method which then // prevents onErrorResumeNext and other similar approaches to error handling if (e instanceof OnErrorNotImplementedException) { throw (OnErrorNotImplementedException) e; } o.onError(e); } } });
@Override public void call(Subscriber<? super T> o) { subscriberOf(observedOn).call(o); }
@Override public void call(Subscriber<? super T> t) { ContextState previousStates = states.install(); try { source.call(new OnAssemblyObservableSubscriber<T>(t, states)); }finally { previousStates.restore(); } }
@Override public void call(Subscriber<? super T> t) { source.call(new OnAssemblyObservableSubscriber<T>(t, contextDataMap)); }
@Override public void call(Subscriber<? super T> subscriber) { upstream.call(new BodySubscriber<>(subscriber)); }
@Override public void call(Subscriber<? super Result<T>> subscriber) { upstream.call(new ResultSubscriber<T>(subscriber)); }
@Override public void call(Subscriber<? super Result<T>> subscriber) { upstream.call(new ResultSubscriber<T>(subscriber)); }
@Override public void call(Subscriber<? super T> subscriber) { upstream.call(new BodySubscriber<T>(subscriber)); }