Duo*_*uos 3 android rx-java2 android-room
我正在使用RxJava2和Room SQLite.我的DAO:
@Dao
public interface HeroDao {
@Insert
long create(Hero hero);
}
Run Code Online (Sandbox Code Playgroud)
这就是我在RxJava2中使用它的方式:
Observable.just((int) heroDao.create(hero))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(id -> /** do stuff **/);
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,我在Logcat中得到的错误是Cannot access database on the main thread since it may potentially lock the UI for a long period of time.我已经尝试附加.allowMainThreadQueries()到数据库构建器并且插入经过以确认我的可观察的正确性.看来LiveData和AsyncTasks是我可以尝试的其他方法,但是当我已经对RxJava2进行了大量投资时,我宁愿不去那里.
那么为什么我会收到这个错误?是否subscribeOn(Schedulers.io())足以卸下主线程的工作?否则我该怎么做?似乎有一些细微之处在于将房间查询转换为我遗漏的可观察对象?
这是因为你使用过Observable.just.这个方法只是将对象包装进去Observable,所以它是在实际订阅之前创建的,并heroDao.create(hero)在主线程上调用.你应该使用Observable.fromCallable(),或者更喜欢Single.fromCallable.你也可以在DAO中定义方法@Insert Single<Int> create(Hero hero);
有一些链接可能会有所帮助:
在Room中使用RxJava
7 Pro-tips for Room进行查询
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |