gpt4 book ai didi

android - subscribeOn() 没有离开主线程

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:01 26 4
gpt4 key购买 nike

我将 RxJava2 与 Room SQLite 结合使用。我的道:

@Dao
public interface HeroDao {
@Insert
long create(Hero hero);
}

这就是我在 RxJava2 中使用它的方式:

Observable.just((int) heroDao.create(hero))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(id -> /** do stuff **/);

但是当我运行该应用程序时,我在 Logcat 中遇到的错误是无法访问主线程上的数据库,因为它可能会长时间锁定 UI。我已经尝试附加.allowMainThreadQueries() 到数据库构建器,然后插入通过,从而确认我的可观察对象的正确性。看来 LiveData 和 AsyncTasks 是我可以尝试的其他方法,但我宁愿不去那里,因为我已经对 RxJava2 进行了认真的投资。

那么为什么我会收到该错误? subscribeOn(Schedulers.io()) 是否足以从主线程卸载工作?否则我该如何做到这一点?似乎有一些关于将 Room 查询转换为我缺少的可观察对象的微妙之处?

最佳答案

因为你用了Observable.just .此方法只是将对象包装到 Observable 中,因此它是在实际订阅之前创建的,并调用 heroDao.create(hero)在主线程上。你应该使用 Observable.fromCallable() ,或者更喜欢 Single.fromCallable .您也可以在 DAO 中定义方法,例如 @Insert Single<Int> create(Hero hero);

有些链接可能有用:
Doing queries in Room with RxJava
7 Pro-tips for Room

关于android - subscribeOn() 没有离开主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com