我正在处理这个问题。
我试图以同步的方式调用RxJava,但是这样做会导致阻塞主线程。
以下是我的代码
@Override
public Single<SettingsBundle> getSettings() {
SettingsBundle settingsModel = mSettingsManager.getSettings();
return Single.just(settingsModel).map(mSettingsMapper);
}这是我的同步电话
@Override
public SettingsBundle getSettingsSync() {
return getSettings().blockingGet();
}我试过这样的东西
@Override
public SettingsBundle getSettingsSync() {
return getSettings()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.blockingGet();
}但它仍然被屏蔽了。
如果我做错了什么,我将非常感谢你的帮助。
谢谢。
发布于 2018-01-05 04:08:47
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()再也不会返回,所有的代码都被阻塞了。
发布于 2017-10-07 22:13:09
.observeOn(AndroidSchedulers.mainThread())
.blockingGet();问题存在于这个特定的运算符组合中。AndroidSchedulers安排代码在主线程上运行,但是blockingGet()会阻止更多代码在该线程上执行。简单地说,AndroidSchedulers和RxJava的阻塞操作符不能很好地协同工作。
由于android调度程序可能用在可观察对象的构造中,这意味着无论您尝试做什么,在主线程上使用blocking*操作符都很容易发生死锁。
发布于 2018-10-10 13:57:27
如果你真的需要一个函数在主线程上运行,并且还需要它是同步的,那么你可以这样做:
如果这是主线程( blockingGet() ),则运行()
observeOn(AndroidSchedulers.mainThread())和funchttps://stackoverflow.com/questions/46614494
复制相似问题