All Downloads are FREE. Search and download functionalities are using the official Maven repository.

rx.subjects.SerializedSubject Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2014 Netflix, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package rx.subjects;

import rx.Subscriber;
import rx.observers.SerializedObserver;

/**
 * Wraps a {@link Subject} so that it is safe to call its various {@code on} methods from different threads.
 * 

* When you use an ordinary {@link Subject} as a {@link Subscriber}, you must take care not to call its * {@link Subscriber#onNext} method (or its other {@code on} methods) from multiple threads, as this could lead * to non-serialized calls, which violates the * Observable contract and creates an ambiguity in the resulting Subject. *

* To protect a {@code Subject} from this danger, you can convert it into a {@code SerializedSubject} with code * like the following: *

{@code
 * mySafeSubject = new SerializedSubject( myUnsafeSubject );
 * }
* * @param the input value type * @param the output value type */ public class SerializedSubject extends Subject { private final SerializedObserver observer; private final Subject actual; public SerializedSubject(final Subject actual) { super(new OnSubscribe() { @Override public void call(Subscriber child) { actual.unsafeSubscribe(child); } }); this.actual = actual; this.observer = new SerializedObserver(actual); } @Override public void onCompleted() { observer.onCompleted(); } @Override public void onError(Throwable e) { observer.onError(e); } @Override public void onNext(T t) { observer.onNext(t); } @Override public boolean hasObservers() { return actual.hasObservers(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy