Android 使用Room和RxJava的非法状态异常

Android 使用Room和RxJava的非法状态异常,android,rx-java2,android-room,Android,Rx Java2,Android Room,我在应用程序中访问房间DAO时遇到问题。 即使我通过rxjava在后台线程中执行操作,也会出现此错误: java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI。 我试图在应用程序中通过MVP使用干净的体系结构,我调用在后台线程中进行该操作的用例 更多信息: 涉及的类别包括: 它从 最后 我需要一些帮助,提前谢谢。您正在使用的只是,它接受已创建/计算的值。因此,基本上,您在调用线程上进行计算,然后将结果包装成一个可观察的。(我无法想象

我在应用程序中访问房间DAO时遇到问题。 即使我通过rxjava在后台线程中执行操作,也会出现此错误:

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);
}
你可以在这里看到这两者的一些例子