1- package rx .ios .schedulers ;
21/**
32 * Copyright 2013 Netflix, Inc.
43 * Copyright 2014 Ashley Williams
1615 * limitations under the License.
1716 */
1817
18+ package rx .ios .schedulers ;
1919
20- import org .robovm .apple .foundation .NSBlockOperation ;
2120import org .robovm .apple .foundation .NSOperationQueue ;
2221import rx .Scheduler ;
2322import rx .Subscription ;
2423import rx .functions .Action0 ;
25- import rx .subscriptions .BooleanSubscription ;
24+ import rx .internal .util .RxThreadFactory ;
25+ import rx .subscriptions .CompositeSubscription ;
2626import rx .subscriptions .Subscriptions ;
2727
2828import java .util .concurrent .Executors ;
29+ import java .util .concurrent .Future ;
2930import java .util .concurrent .ScheduledExecutorService ;
3031import java .util .concurrent .TimeUnit ;
3132
3536public class HandlerThreadScheduler extends Scheduler {
3637
3738 private final NSOperationQueue operationQueue ;
39+ private static final String THREAD_PREFIX = "RxiOSScheduledExecutorPool-" ;
40+
3841
3942 public HandlerThreadScheduler (NSOperationQueue operationQueue ) {
4043 this .operationQueue = operationQueue ;
@@ -49,7 +52,7 @@ public Worker createWorker() {
4952 private static class InnerHandlerThreadScheduler extends Worker {
5053
5154 private final NSOperationQueue operationQueue ;
52- private BooleanSubscription innerSubscription = new BooleanSubscription ();
55+ private CompositeSubscription innerSubscription = new CompositeSubscription ();
5356
5457
5558 public InnerHandlerThreadScheduler (NSOperationQueue operationQueue ) {
@@ -67,43 +70,53 @@ public boolean isUnsubscribed() {
6770 }
6871
6972 @ Override
70- public Subscription schedule (Action0 action0 ) {
71- return schedule (action0 , 0 , TimeUnit . MILLISECONDS );
73+ public Subscription schedule (final Action0 action ) {
74+ return schedule (action , 0 , null );
7275 }
7376
7477 @ Override
7578 public Subscription schedule (final Action0 action , long delayTime , TimeUnit unit ) {
79+ return scheduledAction (action , delayTime , unit );
80+ }
81+
82+ public Subscription scheduledAction (final Action0 action , long delay , TimeUnit unit ) {
7683
77- ScheduledExecutorService executor = Executors .newScheduledThreadPool (1 );
78- final NSBlockOperation runOperation = new NSBlockOperation ();
79-
80- executor .schedule (new Runnable () {
81- @ Override
82- public void run () {
83- if (isUnsubscribed ()) {
84- return ;
85- }
86- /* Runnable for action */
87- final Runnable actionRunner = new Runnable () {
88- @ Override
89- public void run () {
90- action .call ();
91- }
92- };
93-
94- runOperation .addExecutionBlock$ (actionRunner );
95-
96- /* Add operation to operation queue*/
97- operationQueue .addOperation (runOperation );
98- }
99- }, delayTime , unit );
100-
101- return Subscriptions .create (new Action0 () {
102- @ Override
103- public void call () {
104- runOperation .cancel ();
105- }
106- });
84+ if (innerSubscription .isUnsubscribed ()) {
85+ return Subscriptions .empty ();
86+ }
87+
88+ final ScheduledIOSAction scheduledAction = new ScheduledIOSAction (action , operationQueue );
89+ final ScheduledExecutorService executor = IOSScheduledExecutorPool .getInstance ();
90+
91+ Future <?> future ;
92+ if (delay <= 0 ) {
93+ future = executor .submit (scheduledAction );
94+ } else {
95+ future = executor .schedule (scheduledAction , delay , unit );
96+ }
97+
98+ scheduledAction .add (Subscriptions .from (future ));
99+ scheduledAction .addParent (innerSubscription );
100+
101+ return scheduledAction ;
107102 }
108103 }
104+
105+
106+ private static final class IOSScheduledExecutorPool {
107+
108+ private static final RxThreadFactory THREAD_FACTORY = new RxThreadFactory (THREAD_PREFIX );
109+
110+ private static IOSScheduledExecutorPool INSTANCE = new IOSScheduledExecutorPool ();
111+ private final ScheduledExecutorService executorService ;
112+
113+ private IOSScheduledExecutorPool () {
114+ executorService = Executors .newScheduledThreadPool (1 , THREAD_FACTORY );
115+ }
116+
117+ public static ScheduledExecutorService getInstance () {
118+ return INSTANCE .executorService ;
119+ }
120+ }
121+
109122}
0 commit comments