android - 使用 RxAndroid 调度

标签 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();

        }
    });
}

我在演示者中订阅并将结果发布到 View :

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 年的旧解决方案,但此时很多代码已被弃用。这是否可以使用某种递归,或者我能否以更优雅的方式实现?

提前致谢!

最佳答案

您可能想要的是 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() .

关于android - 使用 RxAndroid 调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293804/

相关文章:

android - 在 RecyclerAdapter 中每 n 个项目显示广告

android - 适配chrisbanes Action Bar-Pull To Refresh to Fragments(Navigation Drawer)

android - 在纯服务应用程序中使用 SpeechRecognizer。在主线程上运行代码

android - 如何每 30 分钟运行某种重复任务?

design-patterns - 在 Presenter First 中,为什么接口(interface)上的 SubscribeSomeEvent 方法优于普通的旧事件?

java - Android MVP - 调用服务器

android - 使用单个 SQLite 文件作为存储的正确结构

Powershell:设置计划任务在用户未登录时运行

php - 安排许多作业按时间戳执行

android - 使用 mvp、dagger 2 和 RxJava 的无限滚动回收器 View 的模板代码