java - RxJava Single.just 在主线程中

标签 java android rx-java

此代码从主线程开始,但我在 Schedulers.io 上使用 subscribeOnobserveOn

  disposableBag.add(Single.just(HardOperation.get())
            .doOnSuccess(it -> {
                Log.i("123", Thread.currentThread() + " current"); // Thread[RxCachedThreadScheduler-1,5,main]
            })
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io()).subscribe(it -> {
                adapter.set(it);
                progressBar.setVisibility(View.GONE);
            }));

如果我使用这个示例

disposableBag.add(Single
                .create((SingleOnSubscribe<List<Info>>) emitter -> {
                    emitter.onSuccess(HardOperation.get());
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()).subscribe(it -> {
                    adapter.set(it);
                    progressBar.setVisibility(View.GONE);
                }));

效果很好

最佳答案

我想你是在问为什么HardOperation.get()Single.just() 内部调用时在主线程上运行.

原因是您正在创建一个 Single ( Observable 的子类)使用 Single.just() 。代码是从内向外、从最里面的表达式向外求值的。所以,HardOperation.get()在传递给 Single.just() 之前先被调用。 HardOperation.get()然后,在 RxJava 有机会在不同的线程上执行工作之前,将需要一段时间来完成并阻止整个程序的执行。

第二个代码 fragment 的不同之处在于 Single.create((SingleOnSubscribe<List<Info>>) emitter -> {emitter.onSuccess(HardOperation.get());})创建 Single通过接收产生发出的对象 HardOperation.get() 。创建这个生产者对象的速度很快。请注意 emitter.onSuccess(HardOperation.get())不会立即被调用。 创建生产者并将其赋予 Single.create() 。 RxJava 的工作是调用包装在 Single 中的生产者。在不同的线程上,然后调用 HardOperation.get()无阻塞。

关于java - RxJava Single.just 在主线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60999783/

相关文章:

android - RxAndroid : Create Simple Hot Observable

Java double 并使用非常小的值

java - 如何将值发送到另一个方法

android - 如何获取所有提供具有特定模式的 Intent 的应用程序?

java - Data(timestamp).toLocaleString 总是返回当前日期

java - 改造和 RxJava : How to combine two requests and get access to both results?

java - 从RequestListener派生的匿名类

java - 如何将参数传递给spring数据存储库

java - 使用图像的二进制值更新 xml 文件

android - RxJava 如何从具有间隔的列表中发出对象