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

hu.akarnokd.rxjava2.subscribers.nbp.NbpAsyncObserver Maven / Gradle / Ivy

There is a newer version: 2.0.0-RC3
Show newest version
/**
 * Copyright 2015 David Karnok and 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 hu.akarnokd.rxjava2.subscribers.nbp;

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

import hu.akarnokd.rxjava2.NbpObservable.NbpSubscriber;
import hu.akarnokd.rxjava2.disposables.*;
import hu.akarnokd.rxjava2.internal.disposables.ListCompositeResource;
import hu.akarnokd.rxjava2.internal.functions.Objects;
import hu.akarnokd.rxjava2.internal.subscriptions.SubscriptionHelper;

/**
 * An abstract Subscriber implementation that allows asynchronous cancellation of its
 * subscription.
 * 
 * 

This implementation let's you chose if the AsyncObserver manages resources or not, * thus saving memory on cases where there is no need for that. * *

All pre-implemented final methods are thread-safe. * * @param the value type */ public abstract class NbpAsyncObserver implements NbpSubscriber, Disposable { /** The active subscription. */ private volatile Disposable s; /** Updater of s. */ @SuppressWarnings("rawtypes") private static final AtomicReferenceFieldUpdater S = AtomicReferenceFieldUpdater.newUpdater(NbpAsyncObserver.class, Disposable.class, "s"); /** The resource composite, can be null. */ private final ListCompositeResource resources; /** The cancelled subscription indicator. */ private static final Disposable CANCELLED = new Disposable() { @Override public void dispose() { } }; /** * Constructs an AsyncObserver with resource support. */ public NbpAsyncObserver() { this(true); } /** * Constructs an AsyncObserver and allows specifying if it should support resources or not. * @param withResources true if resource support should be on. */ public NbpAsyncObserver(boolean withResources) { this.resources = withResources ? new ListCompositeResource(Disposables.consumeAndDispose()) : null; } /** * Adds a resource to this AsyncObserver. * *

Note that if the AsyncObserver doesn't manage resources, this method will * throw an IllegalStateException. Use {@link #supportsResources()} to determine if * this AsyncObserver manages resources or not. * * @param resource the resource to add * * @throws NullPointerException if resource is null * @throws IllegalStateException if this AsyncObserver doesn't manage resources * @see #supportsResources() */ public final void add(Disposable resource) { Objects.requireNonNull(resource, "resource is null"); if (resources != null) { add(resource); } else { resource.dispose(); throw new IllegalStateException("This AsyncObserver doesn't manage additional resources"); } } /** * Returns true if this AsyncObserver supports resources added via the add() method. * @return true if this AsyncObserver supports resources added via the add() method * @see #add(Disposable) */ public final boolean supportsResources() { return resources != null; } @Override public final void onSubscribe(Disposable s) { if (!S.compareAndSet(this, null, s)) { s.dispose(); if (s != CANCELLED) { SubscriptionHelper.reportDisposableSet(); } return; } onStart(); } /** * Called once the upstream sets a Subscription on this AsyncObserver. * *

You can perform initialization at this moment. The default * implementation does nothing. */ protected void onStart() { } /** * Cancels the main disposable (if any) and disposes the resources associated with * this AsyncObserver (if any). * *

This method can be called before the upstream calls onSubscribe at which * case the main Disposable will be immediately disposed. */ protected final void cancel() { Disposable a = s; if (a != CANCELLED) { a = S.getAndSet(this, CANCELLED); if (a != CANCELLED && a != null) { a.dispose(); if (resources != null) { resources.dispose(); } } } } @Override public final void dispose() { cancel(); } /** * Returns true if this AsyncObserver has been disposed/cancelled. * @return true if this AsyncObserver has been disposed/cancelled */ public final boolean isDisposed() { return s == CANCELLED; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy