使用 RxAndroid 进行调度

Posted

技术标签:

【中文标题】使用 RxAndroid 进行调度【英文标题】:Use scheduling with RxAndroid 【发布时间】:2016-03-21 12:20:08 【问题描述】:

我正在使用 Rxandroid observable 来检索一些对象(在这种情况下为字符串)。我的服务如下所示:

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

提前致谢!

【问题讨论】:

getRandomStringgetString 一样吗? 是的!为了简单起见,我更改了一些名称。 【参考方案1】:

您可能想要的是Observable.interval()。它按时间间隔发射。然后,您可以将其平面映射到您的 Observable&lt;String&gt;,如下所示:

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() 容易得多。

【讨论】:

感谢您的回答,这似乎工作正常!我将其更改为Observable.interval(0, 3, TimeUnit.MINUTES),因为我不希望一开始就出现延迟。感谢您提供有关 AlarmManager 的提示,但这不是您常用的应用程序,用例是该应用程序将在前台运行数天。但是我对Observable.just() 部分感到困惑,在我的原始帖子中,我删除了所有相关代码,只是在onNext() 中插入了一个模拟字符串,当然使用原始逻辑Observable.just() 不够? @NielsMasdorp 在这些情况下,我使用defer(() -&gt; Observable.just())。这样您就可以在发出项目之前执行代码。使用create() 的问题是您(理论上)必须处理请求和背压,这真的很痛苦。 @DanielLew 我怎么能在每天的特定时间打电话给这个?

以上是关于使用 RxAndroid 进行调度的主要内容,如果未能解决你的问题,请参考以下文章

使用聚合数据的接口进行的RxAndroid学习

使用带有 rxandroid Completable 的自定义转换器

RxJava 和 RxAndroid 四(RxBinding的使用)

RxJava 和 RxAndroid 三(生命周期控制和内存优化)

RxAndroid + Retrofit callTimeout 不会触发 onError

MVP实战心得—封装Retrofit2.0+RxAndroid+RxBus