我正在处理这个问题。
我试图以同步方式调用RxJava,但是这样做会阻塞Main线程。
这是我的代码
@Override
public Single<SettingsBundle> getSettings() {
SettingsBundle settingsModel = mSettingsManager.getSettings();
return Single.just(settingsModel).map(mSettingsMapper);
}
这是我的同步通话
@Override
public SettingsBundle getSettingsSync() {
return getSettings().blockingGet();
}
当调用
getSettingsSync
时,主线程被阻塞,但是有时它可以正常工作,这更成问题了。我已经尝试过类似的东西
@Override
public SettingsBundle getSettingsSync() {
return getSettings()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.blockingGet();
}
但是它仍然被阻止。
我做错了,我将不胜感激。
谢谢。
最佳答案
TL; TR
切勿将observeOn(AndroidSchedulers.mainThread())
与blockingGet()
一起使用
较长版本
输出为:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val result =
Single.just("Hello")
.subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
.map {
println("1. blockingGet `$it` thread: ${Thread.currentThread()}")
return@map it
}
.blockingGet()
println("2. blockingGet `$result` thread: ${Thread.currentThread()}")
}
}
是
1. blockingGet `Hello` thread: Thread[RxCachedThreadScheduler-1,5,main]
2. blockingGet `Hello` thread: Thread[main,5,main]
如您所见,结果是在主线程(第2行)上生成的,映射函数是在RxCachedThreadScheduler线程中执行的。
随着
.observeOn(AndroidSchedulers.mainThread())
行的分解,blockingGet()
永不返回,所有内容都被卡住了。关于android - BlockingGet块UI线程RxJava 2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46614494/