RxJava Single.just-in主线程

RxJava Single.just-in主线程,java,android,rx-java,Java,Android,Rx Java,此代码从主线程开始,但我在Schedulers.io上使用subscribeOn和observeOn disposableBag.add(Single.just(HardOperation.get()) .doOnSuccess(it -> { Log.i("123", Thread.currentThread() + " current"); // Thread[RxCachedThreadScheduler-1,5,main]

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

  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);
                }));
disposableBag.add(单个)
.创建((SingleOnSubscribe)发射器->{
onSuccess(HardOperation.get());
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(it->{
适配器。设置(it);
progressBar.setVisibility(View.GONE);
}));

它工作得很好

我想你是在问为什么在
Single.just()中调用时,
硬操作.get()
在主线程上运行

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

第二个代码段的区别在于
Single.create((SingleOnSubscribe)emitter->{emitter.onSuccess(HardOperation.get());})
通过接收产生发出
HardOperation.get()
的对象来创建
Single
。创建此生产者对象很快。请注意,
emitter.onSuccess(HardOperation.get())
不会立即调用。
生产者被创建并分配给
Single.create()
。RxJava的工作是在另一个线程上调用封装在
Single
中的生产者,然后调用
HardOperation.get()
而不阻塞。

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

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

第二个代码段的区别在于
Single.create((SingleOnSubscribe)emitter->{emitter.onSuccess(HardOperation.get());})
通过接收产生发出
HardOperation.get()
的对象来创建
Single
。创建此生产者对象很快。请注意,
emitter.onSuccess(HardOperation.get())
不会立即调用。
生产者被创建并分配给
Single.create()
。RxJava的工作是在不同的线程上调用封装在
单个
中的生产者,然后调用
硬操作.get()
没有阻塞。

那么问题是什么呢?@BorisSafonov为什么我用
呢?只是
它在主线程中做什么?那么问题是什么呢?@BorisSafonov为什么我用
呢?只是
它在主线程中做什么?回答得好!根据前面的例子,我建议使用
Single.fromCallable{}
而不是
Single.just()
回答得好!根据上述示例,我建议使用
Single.fromCallable{}
而不是
Single.just()