我必须定期轮询一些RESTful端点以刷新我的Android应用程序的数据.我还必须根据连接暂停和恢复它(如果手机处于离线状态,则无需尝试).我目前的解决方案是有效的,但它使用标准的Java ScheduledExecutorService
来执行周期性任务,但我想留在Rx范例中.
这是我当前的代码,为简洁起见,部分内容被跳过.
userProfileObservable = Observable.create(new Observable.OnSubscribe() { @Override public void call(final Subscriber super UserProfile> subscriber) { final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); final Runnable runnable = new Runnable() { @Override public void run() { // making http request here } }; final List > futures = new ArrayList >(1); networkStatusObservable.subscribe(new Action1 () { @Override public void call(Boolean networkAvailable) { if (!networkAvailable) { pause(); } else { pause(); futures.add(scheduledExecutorService.scheduleWithFixedDelay(runnable, 0, SECOND_IN_MILLIS * SECONDS_TO_EXPIRE, TimeUnit.MILLISECONDS)); } } private void pause() { for (ScheduledFuture> future : futures) { future.cancel(true); } futures.clear(); } }); final Subscription subscription = new Subscription() { private boolean isUnsubscribed = false; @Override public void unsubscribe() { scheduledExecutorService.shutdownNow(); isUnsubscribed = true; } @Override public boolean isUnsubscribed() { return isUnsubscribed; } }; subscriber.add(subscription); } }).multicast(BehaviorSubject.create()).refCount();
networkStatusObservable
基本上是一个广播接收器包裹Observable
,表明手机已连接到网络.
正如我所说,这个解决方案正在运行,但是我想使用Rx方法进行定期轮询并发出新的UserProfile
s,因为手动调度事情有很多问题,我想避免这种问题.我知道Observable.timer
并且Observable.interval
,但无法弄清楚如何将它们应用于此任务(我不确定是否需要使用它们).