@Override public Subscription schedule(final Action0 action) { if (subscription.isUnsubscribed()) { // don't schedule, we are unsubscribed return Subscriptions.unsubscribed(); } // This is internal RxJava API but it is too useful. ScheduledAction sa = new ScheduledAction(action); subscription.add(sa); sa.addParent(subscription); ThreadPoolExecutor executor = (ThreadPoolExecutor) threadPool.getExecutor(); FutureTask<?> f = (FutureTask<?>) executor.submit(sa); sa.add(new FutureCompleterWithConfigurableInterrupt(f, shouldInterruptThread, executor)); return sa; }
@Override public Subscription schedule(final Action0 action, long delayTime, TimeUnit unit) { if (isUnsubscribed()) { return Subscriptions.unsubscribed(); } final ScheduledAction sa; if (delayTime <= 0) { sa = new ScheduledAction(action, serial); serial.add(sa); } else { sa = new ScheduledAction(action, timed); timed.add(sa); } final Future<?> result = eventLoop.schedule(sa, delayTime, unit); Subscription cancelFuture = Subscriptions.create(new Action0() { @Override public void call() { result.cancel(false); } }); sa.add(cancelFuture); /*An unsubscribe of the returned sub should cancel the future*/ return sa; }
@Override public void start() { if (source instanceof rx.internal.schedulers.SchedulerLifecycle) { ((rx.internal.schedulers.SchedulerLifecycle)source).start(); } }
@Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { if (innerSubscription.isUnsubscribed()) { // don't schedule, we are unsubscribed return Subscriptions.empty(); } ScheduledAction s = poolWorker.scheduleActual(action, delayTime, unit); innerSubscription.add(s); s.addParent(innerSubscription); return s; } }
@Test public void startStopSupport() { Scheduler v2Scheduler = mock(Scheduler.class); rx.Scheduler v1Scheduler = RxJavaInterop.toV1Scheduler(v2Scheduler); SchedulerLifecycle lc = (SchedulerLifecycle)v1Scheduler; lc.start(); verify(v2Scheduler).start(); lc.shutdown(); verify(v2Scheduler).shutdown(); } }
@Override public void shutdown() { if (source instanceof rx.internal.schedulers.SchedulerLifecycle) { ((rx.internal.schedulers.SchedulerLifecycle)source).shutdown(); } }
@Override public Worker createWorker() { return new NewThreadWorker(THREAD_FACTORY); } }
@Override public Subscription schedule(final Action0 action) { return schedule(action, 0, null); }
/** * Adds a parent {@link CompositeSubscription} to this {@code ScheduledAction} so when the action is * cancelled or terminates, it can remove itself from this parent. * * @param parent * the parent {@code CompositeSubscription} to add */ public void addParent(CompositeSubscription parent) { cancel.add(new Remover(this, parent)); }
@Override public Subscription schedule(final Action0 action, long delayTime, TimeUnit unit) { if (isUnsubscribed) { return Subscriptions.empty(); } return scheduleActual(action, delayTime, unit); }
@Override public void run() { try { action.call(); } finally { unsubscribe(); } }
ScheduledAction createScheduledAction(Action0 action) { final ScheduledAction scheduledAction = new ScheduledAction(action); scheduledAction.add(Subscriptions.create(new Action0() { @Override public void call() { handler.removeCallbacks(scheduledAction); } })); scheduledAction.addParent(compositeSubscription); compositeSubscription.add(scheduledAction); return scheduledAction; }
@Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { if (innerSubscription.isUnsubscribed()) { // don't schedule, we are unsubscribed return Subscriptions.empty(); } ScheduledAction s = threadWorker.scheduleActual(action, delayTime, unit); innerSubscription.add(s); s.addParent(innerSubscription); return s; } }
@Test public void startStopSupported() { rx.Scheduler v1Scheduler = mock(rx.Scheduler.class, withSettings().extraInterfaces(SchedulerLifecycle.class)); io.reactivex.Scheduler v2Scheduler = RxJavaInterop.toV2Scheduler(v1Scheduler); v2Scheduler.start(); ((SchedulerLifecycle)verify(v1Scheduler)).start(); v2Scheduler.shutdown(); ((SchedulerLifecycle)verify(v1Scheduler)).shutdown(); } }
@Override public void start() { if (source instanceof rx.internal.schedulers.SchedulerLifecycle) { ((rx.internal.schedulers.SchedulerLifecycle)source).start(); } }
@Override public void shutdown() { if (source instanceof rx.internal.schedulers.SchedulerLifecycle) { ((rx.internal.schedulers.SchedulerLifecycle)source).shutdown(); } }
@Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { if (compositeSubscription.isUnsubscribed()) { return Subscriptions.unsubscribed(); } final ScheduledAction scheduledAction = new ScheduledAction(action); scheduledAction.addParent(compositeSubscription); compositeSubscription.add(scheduledAction); handler.postDelayed(scheduledAction, unit.toMillis(delayTime)); scheduledAction.add(Subscriptions.create(() -> handler.removeCallbacks(scheduledAction))); return scheduledAction; } }
@Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { if (innerSubscription.isUnsubscribed()) { // don't schedule, we are unsubscribed return Subscriptions.empty(); } ScheduledAction s = (ScheduledAction)innerWorker.schedule(action, delayTime, unit); innerSubscription.add(s); s.addParent(innerSubscription); return s; } }
@Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { if (innerSubscription.isUnsubscribed()) { // don't schedule, we are unsubscribed return Subscriptions.empty(); } ScheduledAction s = (ScheduledAction)innerWorker.schedule(action, delayTime, unit); innerSubscription.add(s); s.addParent(innerSubscription); return s; } }
@Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { if (innerSubscription.isUnsubscribed()) { // don't schedule, we are unsubscribed return Subscriptions.empty(); } ScheduledAction s = (ScheduledAction)innerWorker.schedule(action, delayTime, unit); innerSubscription.add(s); s.addParent(innerSubscription); return s; } }