rxJava, периодически обновлять данные API

Я использую следующие наблюдаемые для вызова модифицированного API, а затем сохраняю ответ в файл кеша:

@Override public Observable<StoryCollectionEntity> storyEntityList(final int page) {

       return this.restApi.storyCollection(id, page)
       .doOnNext(saveStoryCollectionToCacheAction)         
   .onErrorResumeNext(CloudNewsDataStore.this.mNewsCache.getStories(page));
            }

Это работает, как и ожидалось. мой вопрос: как я могу заставить этот наблюдатель периодически возвращать ответ API?

скажем, пользователь хочет обновлять данные каждые 5 минут


person Fshamri    schedule 14.12.2015    source источник
comment
Возможно, вам это не нужно, так как обновление данных каждые 5 минут = разрядка батареи и, следовательно, потеря пользователей. Вы хотите синхронизировать интеллектуально, используйте SyncAdapter. ОС Android сильно оптимизирована для синхронизации данных с помощью SyncAdapter, и ее несложно настроить.   -  person Lucas Crawford    schedule 15.12.2015


Ответы (1)


Оператор interval() выдает элемент через заданный интервал времени.

Вы можете использовать это для запуска периодических событий, например:

Observable.interval(5, TimeUnit.MINUTES)
            .flatMap(count -> this.restApi.storeCollection(id, page))
            // etc.
person Bryan Herbst    schedule 14.12.2015
comment
как насчет заявления о возврате? должен ли он возвращаться Observable.interval(5, TimeUnit.MINUTES)... - person Fshamri; 15.12.2015
comment
Если вы хотите вернуть этот Observable, то да. Мой пример не обязательно должен был быть вставлен непосредственно в ваш код, но был примером, который каждый мог использовать в своем коде. - person Bryan Herbst; 15.12.2015
comment
есть ли подробный пример .. плз - person Fshamri; 15.12.2015
comment
Насколько больше деталей вам нужно? Для вашего конкретного случая использования вы буквально просто ставите вызов interval() и flatMap() перед кодом, который у вас уже есть. - person Bryan Herbst; 15.12.2015
comment
Я последовал вашему предложению, но пользовательский интерфейс некоторое время блокируется - person Fshamri; 15.12.2015
comment
Похоже, вы неправильно используете subscribeOn(), чтобы указать своим Observables выполнять свою работу в потоке, отличном от пользовательского интерфейса. - person Bryan Herbst; 15.12.2015
comment
Вам нужно использовать Observable.interval(0, 5, TimeUnit.MINUTES), где первый 0 является начальной задержкой, прежде чем Observable выдаст первый элемент. - person Martin; 11.12.2017