Rxandroid SubscribeOn和ObserveOn有什么区别

2022-08-31 10:40:47

我只是在学习Rx-java和Rxandroid2,我只是感到困惑,SubscribeOn和ObserveOn之间的主要区别是什么。


答案 1

SubscribeOn 指定可观察对象将在其上运行的计划程序。ObserveOn 指定观察器将在其上观察此 Observable 的计划程序。

因此,基本上 SubscribeOn 主要在后台线程上订阅(执行)(您不想在等待可观察量时阻塞 UI 线程),并且在 ObserveOn 中,您希望在主线程上观察结果...

如果您熟悉AsyncTask,那么SubscriptOn类似于doInBackground方法,ObserveOn类似于onPostExecute...


答案 2

如果您发现上面的答案充满了行话:

tl;博士

 Observable.just("Some string")                 
           .map(str -> str.length())              
           .observeOn(Schedulers.computation())   
           .map(length -> 2 * length)   
           .observeOn(AndroidSchedulers.mainThread())
           .subscribeOn(Schedulers.io())
           .subscribe(---)

观察可观察的...在 IO 线程中执行映射函数(因为我们是该线程)...现在切换到计算线程并执行功能...最后确保观察()线程上的输出。"subscribingOn"map(length -> 2 * length)observeOn()

无论如何

observeOn()只需更改下游所有操作员的线程即可。人们通常有这种误解,这种误解也起到了上游的作用,但事实并非如此。observeOn

下面的示例将更好地解释它...

Observable.just("Some string")                  // UI
       .map(str -> str.length())               // UI
       .observeOn(Schedulers.computation())   // Changing the thread
       .map(length -> 2 * length)            // Computation
       .subscribe(---)                       // Computation

subscribeOn()影响当 Observable 将被订阅时将使用的线程,并且它将留在下游。

Observable.just("Some String")              // Computation
  .map(str -> str.length())                // Computation
  .map(length -> 2 * length)              // Computation
  .subscribeOn(Schedulers.computation()) // -- changing the thread
  .subscribe(number -> Log.d("", "Number " + number)); // Computation

位置无关紧要 (subscribeOn())

为什么?因为它只影响订阅的时间。

服从与 subscribeOn 联系的方法

-> 基本示例 :Observable.create

主体内指定的所有工作都将在 中指定的线程上运行。createsubscribeOn

另一个示例:,或Observable.justObservable.fromObservable.range

注意:所有这些方法都接受值,因此不要使用阻止方法来创建这些值,因为 subscribeOn 不会影响它。

如果要使用阻止功能,请使用

Observable.defer(() -> Obervable.just(blockingMenthod())));

重要事实:

订阅On 不起作用Subjects

倍数:subscribeOn

如果流中有多个 实例,则只有第一个实例具有实际效果。subscribeOn

订阅和subscribeOn

人们认为这与 有关,但与它没有任何特别关系。它只影响订阅阶段subscribeOnObservable.subscribe

来源 : 托梅克·波兰斯基 ()


推荐