Android アプリのデータを更新するために、RESTful エンドポイントを定期的にポーリングする必要があります。また、接続に基づいて一時停止して再開する必要があります (電話がオフラインの場合は、試す必要さえありません)。私の現在のソリューションは機能していますがScheduledExecutorService
、定期的なタスクを実行するために標準の Java を使用していますが、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>
であり、電話がネットワークに接続されていることを示します。
私が言ったように、このソリューションは機能していますが、定期的なポーリングと新しいUserProfile
s の発行には Rx アプローチを使用したいと考えています。Observable.timer
とについては知ってObservable.interval
いますが、それらをこのタスクに適用する方法がわかりません (そして、それらを使用する必要があるかどうかはわかりません)。