Skip to content

2.x: Disposable returned from Single.subscribe() is not disposed after terminal event #5160

Closed
@kxfeng

Description

@kxfeng

When using Single.subscribe(onSuccess, onError) , the returned Disposable is not disposed after terminal event. However , for Observable, Flowable, Maybe and Completable , the results are all disposed.

Here is the test code:

@Test
public void testDisposable() throws Exception {

	Disposable disposable;

	disposable = Single.just(1).subscribe(
		next -> System.out.println("Single Success"),
		error -> System.out.println("Single Error")
	);

	System.out.println("Single Disposed: " + disposable.isDisposed());

	disposable = Observable.just(1).subscribe(
		next -> System.out.println("Observable Next"),
		error -> System.out.println("Observable Error"),
		() -> System.out.println("Observable Complete")
	);

	System.out.println("Observable Disposed: " + disposable.isDisposed());
}

Output:

Single Success
Single Disposed: false

Observable Next
Observable Complete
Observable Disposed: true

I found the Disposeable not lazySet to DISPOSED in ConsumerSingleObserver compared with LambdaObserver. Is this a bug or there are some special reasons to do this?

ConsumerSingleObserver

@Override
public void onSuccess(T value) {
	try {
		onSuccess.accept(value);
	} catch (Throwable ex) {
		Exceptions.throwIfFatal(ex);
		RxJavaPlugins.onError(ex);
	}
}
LambdaObserver

@Override
public void onComplete() {
	if (!isDisposed()) {
		lazySet(DisposableHelper.DISPOSED);
		try {
			onComplete.run();
		} catch (Throwable e) {
			Exceptions.throwIfFatal(e);
			RxJavaPlugins.onError(e);
		}
	}
}

RxJava 2.0.6

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions