首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlockingGet数据块UI线程RxJava 2

BlockingGet数据块UI线程RxJava 2
EN

Stack Overflow用户
提问于 2017-10-07 05:59:53
回答 3查看 13.1K关注 0票数 8

我正在处理这个问题。

我试图以同步的方式调用RxJava,但是这样做会导致阻塞主线程。

以下是我的代码

代码语言:javascript
复制
   @Override
    public Single<SettingsBundle> getSettings() {
        SettingsBundle settingsModel = mSettingsManager.getSettings();
        return Single.just(settingsModel).map(mSettingsMapper);
    }

这是我的同步电话

代码语言:javascript
复制
   @Override
    public SettingsBundle getSettingsSync() {
        return getSettings().blockingGet();
    }

我试过这样的东西

代码语言:javascript
复制
@Override
public SettingsBundle getSettingsSync() {
    return getSettings()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .blockingGet();
}

但它仍然被屏蔽了。

如果我做错了什么,我将非常感谢你的帮助。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-01-05 04:08:47

TL;TR

切勿将observeOn(AndroidSchedulers.mainThread())blockingGet()一起使用

长版本

以下内容的输出:

代码语言:javascript
复制
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()}")
    }
}

代码语言:javascript
复制
 1. blockingGet `Hello` thread: Thread[RxCachedThreadScheduler-1,5,main]
 2. blockingGet `Hello` thread: Thread[main,5,main]

如您所见,结果是在主线程上生成的(第2行),映射函数是在RxCachedThreadScheduler线程中执行的。

随着代码行.observeOn(AndroidSchedulers.mainThread())的分解,blockingGet()再也不会返回,所有的代码都被阻塞了。

票数 17
EN

Stack Overflow用户

发布于 2017-10-07 22:13:09

代码语言:javascript
复制
.observeOn(AndroidSchedulers.mainThread())
.blockingGet();

问题存在于这个特定的运算符组合中。AndroidSchedulers安排代码在主线程上运行,但是blockingGet()会阻止更多代码在该线程上执行。简单地说,AndroidSchedulersRxJava的阻塞操作符不能很好地协同工作。

由于android调度程序可能用在可观察对象的构造中,这意味着无论您尝试做什么,在主线程上使用blocking*操作符都很容易发生死锁。

票数 4
EN

Stack Overflow用户

发布于 2018-10-10 13:57:27

如果你真的需要一个函数在主线程上运行,并且还需要它是同步的,那么你可以这样做:

如果这是主线程( blockingGet() ),则运行()

  1. 如果不在主线程上,则可以结合使用observeOn(AndroidSchedulers.mainThread())和func
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46614494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档