Android 使用Room和RxJava的非法状态异常
我在应用程序中访问房间DAO时遇到问题。 即使我通过rxjava在后台线程中执行操作,也会出现此错误:Android 使用Room和RxJava的非法状态异常,android,rx-java2,android-room,Android,Rx Java2,Android Room,我在应用程序中访问房间DAO时遇到问题。 即使我通过rxjava在后台线程中执行操作,也会出现此错误: java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI。 我试图在应用程序中通过MVP使用干净的体系结构,我调用在后台线程中进行该操作的用例 更多信息: 涉及的类别包括: 它从 最后 我需要一些帮助,提前谢谢。您正在使用的只是,它接受已创建/计算的值。因此,基本上,您在调用线程上进行计算,然后将结果包装成一个可观察的。(我无法想象
java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI。
我试图在应用程序中通过MVP使用干净的体系结构,我调用在后台线程中进行该操作的用例
更多信息:
涉及的类别包括:
它从
最后
我需要一些帮助,提前谢谢。您正在使用的
只是
,它接受已创建/计算的值。因此,基本上,您在调用线程上进行计算,然后将结果包装成一个可观察的
。(我无法想象为什么这种逻辑上的误解会如此频繁地出现,因为没有主流语言会在普通括号之间延迟计算。)
改为这样做:
@覆盖
公共可观察更新原则(列出jsonRecipes){
返回可观察。从可调用(()->{
mRecipeDb.runInTransaction(()->
deleteoldandinsertnewrecipes事务(jsonRecipes));
返回true;
});
}
使用RxJava并不意味着您正在进行异步处理,事实上RxJava在默认情况下是同步的
如果要使操作异步,则需要使用操作符subscribebeon
,它将订阅要在另一个线程中运行的可观察对象,或者使用observerOn指定要异步执行的操作
一个例子
/**
* Once that you set in your pipeline the observerOn all the next steps of your pipeline will be executed in another thread.
* Shall print
* First step main
* Second step RxNewThreadScheduler-2
* Third step RxNewThreadScheduler-1
*/
@Test
public void testObservableObserverOn() throws InterruptedException {
Subscription subscription = Observable.just(1)
.doOnNext(number -> System.out.println("First step " + Thread.currentThread()
.getName()))
.observeOn(Schedulers.newThread())
.doOnNext(number -> System.out.println("Second step " + Thread.currentThread()
.getName()))
.observeOn(Schedulers.newThread())
.doOnNext(number -> System.out.println("Third step " + Thread.currentThread()
.getName()))
.subscribe();
new TestSubscriber((Observer) subscription)
.awaitTerminalEvent(100, TimeUnit.MILLISECONDS);
}
你可以在这里看到这两者的一些例子