我必须定期轮询一些 RESTful 端点以刷新我的 android 应用程序的数据。我还必须根据连接暂停和恢复它(如果手机离线,甚至不需要尝试)。我当前的解决方案正在运行,但它使用标准 JavaScheduledExecutorService
来执行周期性任务,但我想留在 Rx 范式中。
这是我当前的代码,为简洁起见,跳过了部分代码。
userProfileObservable = Observable.create(new Observable.OnSubscribe<UserProfile>() {
@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<ScheduledFuture<?>> futures = new ArrayList<ScheduledFuture<?>>(1);
networkStatusObservable.subscribe(new Action1<Boolean>() {
@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<Boolean>
中,表示手机已连接到网络。
正如我所说,这个解决方案是有效的,但我想使用 Rx 方法进行定期轮询和发出 new UserProfile
s,因为手动安排事情有很多问题,我想避免这些问题。我知道Observable.timer
and Observable.interval
,但不知道如何将它们应用于此任务(而且我不确定是否需要使用它们)。