gpt4 book ai didi

android - 具有Room错误处理的RxJava2-数据库主线程异常

转载 作者:行者123 更新时间:2023-12-03 08:06:37 25 4
gpt4 key购买 nike

我正在尝试从远程源检索项目,如果这不起作用(没有互联网),我想从 session 室数据库中检索缓存的项目。
我为错误发生的时间创建了一个新的单曲,并指定了应该订阅和观察的线程。我还是这个异常(exception):

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

这是检索项目的方法:
public LiveData<List<Article>> getNewsArticles() {
return LiveDataReactiveStreams.fromPublisher(
newsService.getNewsArticles()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

.onErrorResumeNext(throwable ->
Single.just(newsDao.findAllForNumber(AMOUNT_OF_ARTICLES_PER_PAGE))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

.doOnSuccess(newsArticles -> Completable.fromAction(() ->
newsDao.insertAll(newsArticles))
.subscribeOn(Schedulers.io()))
.toFlowable());
}

LiveDataReactiveStreams将其转换为livedata对象并处理订阅,因此我的 View 仅了解livedata。

我只是似乎无法使onErrorResumeNext调用在后台线程上工作。

任何帮助将不胜感激!

答案

我最终用以下代码解决了这个问题:
public LiveData<List<Article>> getNewsArticles() {
return LiveDataReactiveStreams.fromPublisher(
newsService.getNewsArticles()
.observeOn(Schedulers.io())
.doOnSuccess(newsArticles -> newsDao.insertAll(newsArticles))
.onErrorResumeNext(throwable -> Single.fromCallable(() -> newsDao.findAllForNumber(AMOUNT_OF_ARTICLES_PER_PAGE)))
.toFlowable());
}

最佳答案

在RxJava方法subscribeOn中,指定将在其上运行Observable的Scheduler。但是方法observeOn指定了调度程序,观察者将在该调度程序上观察此Observable。

简单来说:

Single
.zip(observable1.getList(), observable2.getAnotherList()) // Simple zip for example
.observeOn(AndroidSchedulers.mainThread()) // switch to main thread
.map(mapper.map(list1, list2)) // this command will execute on main thread
.observeOn(Schedulers.io()) // switch to io thread
.map(anotherMapper.map(complexList)) // this command will execute on io thread
.observeOn(AndroidSchedulers.mainThread()) // switch to main thread
.subscribeOn(Schedulers.io()) // specify thread for zip command

ObserveOn仅在下游起作用。 beforeOn之后的所有方法均已移至IO线程。而observeOn之前的方法仍在主线程中。

在您的示例中,您尝试在主线程上调用room dao命令,并且系统不允许在主线程上执行。您可以在每个命令上设置断点,然后在IDE中准确查找要执行命令的线程名称。

有关更复杂的示例,请参见此 article

关于android - 具有Room错误处理的RxJava2-数据库主线程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53010121/

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