/** * Returns a new, non-disposed Disposable instance. * @return a new, non-disposed Disposable instance */ @NonNull public static Disposable empty() { return fromRunnable(Functions.EMPTY_RUNNABLE); }
@Override public Disposable call() { return Disposables.fromRunnable(unsubscribe); } };
@Override public Disposable call() { return Disposables.fromRunnable(unsubscribe); } };
@Override public Disposable call() { return Disposables.fromRunnable(unsubscribe); } };
@Override public Disposable call() { return Disposables.fromRunnable(unsubscribe); } };
/** * Returns a new, non-disposed Disposable instance. * @return a new, non-disposed Disposable instance */ @NonNull public static Disposable empty() { return fromRunnable(Functions.EMPTY_RUNNABLE); }
@NonNull @Override public Disposable schedule(@NonNull Runnable run, long delayTime, @NonNull TimeUnit unit) { if (disposed) { return EmptyDisposable.INSTANCE; } final TimedRunnable timedAction = new TimedRunnable(this, time + unit.toNanos(delayTime), run, counter++); queue.add(timedAction); return Disposables.fromRunnable(new QueueRemove(timedAction)); }
@Override public void subscribe(Observer<? super String> observer) { subsCount.incrementAndGet(); observer.onSubscribe(Disposables.fromRunnable(new Runnable() { @Override public void run() { subsCount.decrementAndGet(); } })); } };
@NonNull @Override public Disposable schedule(@NonNull Runnable run) { if (disposed) { return EmptyDisposable.INSTANCE; } final TimedRunnable timedAction = new TimedRunnable(this, 0, run, counter++); queue.add(timedAction); return Disposables.fromRunnable(new QueueRemove(timedAction)); }
@Override public void subscribe(Observer<? super Integer> observer) { subscriptionCount.incrementAndGet(); observer.onSubscribe(Disposables.fromRunnable(new Runnable() { @Override public void run() { unsubscriptionCount.incrementAndGet(); } })); } });
@Test public void testUnsubscribeOnlyOnce() { Runnable dispose = mock(Runnable.class); Disposable subscription = Disposables.fromRunnable(dispose); subscription.dispose(); subscription.dispose(); verify(dispose, times(1)).run(); }
@Override public void subscribe(final Observer<? super Observable<Long>> observer) { // verbose on purpose so I can track the inside of it final Disposable upstream = Disposables.fromRunnable(new Runnable() { @Override public void run() { System.out.println("*** unsubscribed"); unsubscribed.set(true); } }); observer.onSubscribe(upstream); new Thread(new Runnable() { @Override public void run() { while (!unsubscribed.get()) { observer.onNext(Observable.just(1L, 2L)); } System.out.println("Done looping after unsubscribe: " + unsubscribed.get()); observer.onComplete(); // mark that the thread is finished latch.countDown(); } }).start(); }
@NonNull @Override public Disposable schedule(@NonNull Runnable run) { if (disposed) { return EmptyDisposable.INSTANCE; } final TimedRunnable timedAction = new TimedRunnable(this, 0, run, counter++); queue.add(timedAction); return Disposables.fromRunnable(new QueueRemove(timedAction)); }
@NonNull @Override public Disposable schedule(@NonNull Runnable run, long delayTime, @NonNull TimeUnit unit) { if (disposed) { return EmptyDisposable.INSTANCE; } final TimedRunnable timedAction = new TimedRunnable(this, time + unit.toNanos(delayTime), run, counter++); queue.add(timedAction); return Disposables.fromRunnable(new QueueRemove(timedAction)); }
@Override public void subscribe(Observer<? super Long> observer) { final AtomicBoolean cancel = new AtomicBoolean(); observer.onSubscribe(Disposables.fromRunnable(new Runnable() { @Override public void run() { cancel.set(true); } })); for (;;) { if (cancel.get()) { break; } try { Thread.sleep(100); } catch (InterruptedException e) { } observer.onNext(1L); } } });
@Test public void testSuccess() { final AtomicInteger counter = new AtomicInteger(); CompositeDisposable cd = new CompositeDisposable(); cd.add(Disposables.fromRunnable(new Runnable() { @Override public void run() { counter.incrementAndGet(); } })); cd.add(Disposables.fromRunnable(new Runnable() { @Override public void run() { counter.incrementAndGet(); } })); cd.dispose(); assertEquals(2, counter.get()); }
@Override public void subscribe(final SingleObserver<? super String> observer) { SerialDisposable sd = new SerialDisposable(); observer.onSubscribe(sd); final Thread t = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); observer.onSuccess("success"); } catch (InterruptedException e) { interrupted.set(true); latch.countDown(); } } }); sd.replace(Disposables.fromRunnable(new Runnable() { @Override public void run() { unsubscribed.set(true); t.interrupt(); latch.countDown(); } })); t.start(); } });
@Override public void subscribe(final SingleObserver<? super String> observer) { SerialDisposable sd = new SerialDisposable(); observer.onSubscribe(sd); final Thread t = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); observer.onSuccess("success"); } catch (InterruptedException e) { interrupted.set(true); latch.countDown(); } } }); sd.replace(Disposables.fromRunnable(new Runnable() { @Override public void run() { unsubscribed.set(true); t.interrupt(); latch.countDown(); } })); t.start(); } });
@Test public void testException() { final AtomicInteger counter = new AtomicInteger(); CompositeDisposable cd = new CompositeDisposable(); cd.add(Disposables.fromRunnable(new Runnable() { @Override public void run() { throw new RuntimeException("failed on first one"); } })); cd.add(Disposables.fromRunnable(new Runnable() { @Override public void run() { counter.incrementAndGet(); } })); try { cd.dispose(); fail("Expecting an exception"); } catch (RuntimeException e) { // we expect this assertEquals(e.getMessage(), "failed on first one"); } // we should still have disposed to the second one assertEquals(1, counter.get()); }
@Test public void testUnsubscribeIdempotence() { final AtomicInteger counter = new AtomicInteger(); CompositeDisposable cd = new CompositeDisposable(); cd.add(Disposables.fromRunnable(new Runnable() { @Override public void run() { counter.incrementAndGet(); } })); cd.dispose(); cd.dispose(); cd.dispose(); // we should have only disposed once assertEquals(1, counter.get()); }