使用RxAndroid安排

时间:2015-12-15 16:01:27

标签: android scheduled-tasks mvp rx-java rx-android

我使用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分钟)。我可以使用TimerScheduledThreadPoolExecutor一遍又一遍地执行此操作,但我想知道RxAndroid领域内是否存在某些解决方案。我从2013年发现了一些旧的解决方案,但目前很多代码都被弃用了。这可能是使用某种递归,还是我能以更优雅的方式实现这一点?

提前致谢!

1 个答案:

答案 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...);

这就是说 - 如果您每隔几分钟就会这样做,那么您可能最好不要关注AlarmManagerJobScheduler,因为用户赢得的机会很大在很长一段时间内专注于你的应用程序。

顺便说一下,使用Observable.just("this is a string")Observable.create()更容易。