我正在使用Rx
Android 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年发现了一些旧的解决方案,但目前很多代码都被弃用了.这可能是使用某种递归,还是我能以更优雅的方式实现这一点?
提前致谢!
解决方法
你可能想要的是
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(“这是一个字符串”)要比Observable.create()容易得多.