Мне нужно периодически опробовать некоторую конечную точку RESTful, чтобы обновить данные приложения для Android. Я также должен приостановить и возобновить его на основе подключения (если телефон отключен, нет необходимости даже пытаться). Мое текущее решение работает, но оно использует стандартный Java ScheduledExecutorService
для выполнения периодических задач, но я бы хотел остаться в парадигме 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-подход для периодического опроса и испускания новых UserProfile
s, потому что есть множество проблем с планированием вещей вручную, чего я хочу избежать. Я знаю о Observable.timer
и Observable.interval
, но не могу понять, как применить их к этой задаче (и я не уверен, что мне нужно вообще их использовать).