我正在处理这个问题。

我试图以同步方式调用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/

10-09 07:35
查看更多