我使用RxAndroid observable
来检索某个对象(在本例中为String)。我的服务如下:
public Observable<String> getRandomString() {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
//code to retrieve result
subscriber.onNext("this is a string");
subscriber.onCompleted();
}
});
}
我在演示者中订阅并将结果发布到视图中:
public void loadRandomString() {
Observable<String> observable = mService.getRandomString();
observable
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) {
mMainView.onError(e.getLocalizedMessage());
}
@Override
public void onNext(String string) {
//do something with string
}
});
}
这样可以正常工作,但我希望这个操作定期(每隔x分钟)。我可以使用Timer
或ScheduledThreadPoolExecutor
一遍又一遍地执行此操作,但我想知道RxAndroid领域内是否存在某些解决方案。我从2013年发现了一些旧的解决方案,但目前很多代码都被弃用了。这可能是使用某种递归,还是我能以更优雅的方式实现这一点?
提前致谢!
答案 0 :(得分:7)
你可能想要的是Observable.interval()
。它以定时间隔发出。然后,您可以将其平面映射到Observable<String>
,如下所示:
Observable.interval(3, TimeUnit.MINUTES)
.flatMap(new Func1<Long, Observable<String>>() {
@Override
public Observable<String> call(Long ignore) {
return getRandomString();
}
})
.subscribe(...insert your subscriber here...);
这就是说 - 如果您每隔几分钟就会这样做,那么您可能最好不要关注AlarmManager或JobScheduler,因为用户赢得的机会很大在很长一段时间内专注于你的应用程序。
顺便说一下,使用Observable.just("this is a string")
比Observable.create()
更容易。