此代码从主线程开始,但我在 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);
}));
效果很好
最佳答案
我想你是在问为什么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/