当前位置: 首页 > 知识库问答 >
问题:

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

姜飞飙
2023-03-14

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

java。lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI

我试图在应用程序中通过MVP使用干净的体系结构,我称之为在后台线程中进行该操作的用例。

更多信息:

涉及的类别包括:

主持人。JAVA

更新密码。从用例扩展而来的java。JAVA

最后是ReciphaLocalDataSource.java

我需要一些帮助,提前谢谢。


共有2个答案

融烨磊
2023-03-14

使用RxJava并不意味着你在做异步过程,事实上RxJava默认是同步的。

如果你想让一个操作异步,你需要使用操作符subscribeOn,它将订阅你的observable在另一个线程中运行,或者使用observon指定你想要异步完成的操作。

一个例子

/**
 * 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);
}

你可以在这里看到这两个例子https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java

祁渊
2023-03-14

您正在使用的只是,它接受一个已经创建/计算的值。基本上,你在调用线程上进行计算,然后把结果包装成一个可观察的。(我无法想象为什么这种逻辑上的误解会如此频繁地出现,因为没有一种主流语言会在普通括号之间延迟计算。)

改为这样做:

@Override
public Observable<Boolean> updateRecipes(List<JsonRecipe> jsonRecipes) {
    return Observable.fromCallable(() -> {
        mRecipeDb.runInTransaction(() ->
            deleteOldAndInsertNewRecipesTransaction(jsonRecipes));
        return true;
    });
}

 类似资料:
  • 我正在尝试修复crashlytics在我发布给play store的应用程序中报告的一些错误 我查看了日志,但我不知道如何修复它。。。 实际上,我所有的rx代码都是这样处理错误的: 而WorkDao是: 但是我在崩溃报告中找不到我的错误日志。 我该怎么办?

  • 问题内容: 如何将轮询线程传递给另一个线程进行处理。程序执行在具有主方法和线程池的控制器类中: 主类控制器 具有轮询类的线程的方法 具有proc类的线程的方法 轮询类和控制器类 我的任务和问题是: 1.控制器应同时处理轮询器和处理器线程,并且应仅调用轮询器和处理器线程 2.现在我的问题是如何使轮询线程等待3秒并并行通知处理器。 我得到如下错误: 这里如何实现异步处理? 问题答案: 你需要阅读的东西

  • 我正在尝试使用下面的快速加载API 连接…等是完美的。 我确切地知道它在哪里失败 例外情况是 < code >线程“main”Java . lang . illegalstateexception中出现异常:示例失败。 这是我试图上传的表格。它是格式,当我通过记事本打开它时,它看起来像这样 为什么我会得到这个异常?我该如何改进?据我理解问题是< code > pstmtfld . setascii

  • 我创建了以下EJB模块: 1)我的远程接口 2)实现接口的bean 3)接下来我创建了一个属性文件jboss-ejb-client.properties 在部署到wildfly之后,一切都很好。我得到以下信息: 4) 然后我创建了Java客户端 代码很简单。但是如果我运行客户端,我会收到以下错误消息: 我正在使用Netbean 8.2、JavaEE 7和Wildfly 10.1.0-Final。我

  • 问题内容: 这是我的用法- 另外,我在http GET周围放置了一个finally块- 这是我的堆栈跟踪- 我正在使用Quartz计划监视Http端点的工作。这是我的连接池配置 Maven依赖..工件版本 编辑 -好吧,通过不关闭finally块中的CloseableHttpClient,问题解决了。有人能说出为什么这样吗? 如果关闭客户端,为什么连接池会关闭? 是上面的closeablehttp

  • 这是我如何使用它 - 此外,我已经在超文本传输协议GET周围放置了一个最终块- 这是我的堆栈跟踪- 我正在使用Quartz来安排监控Httpendpoint的工作…这是我的连接池配置 马文依赖..神器版本 编辑-嗯,这个问题通过在最后一个块中不关闭CloseableHttp客户端而得到解决…有人能告诉我为什么它会这样吗?如果我关闭客户端,为什么连接池会关闭? 上面的closeablehttpcli