gpt4 book ai didi

android - 我应该如何在嵌套代码中返回 "Observable/Flowable/Single" "onError"?

转载 作者:行者123 更新时间:2023-11-29 23:45:53 25 4
gpt4 key购买 nike

我正在使用“RxJava”、“Room”、“Firebase (Firestore)”和“Kotlin”开发 Android 应用程序。它基于 MVP 模式。

我是 RxJava 的新手,所以我需要帮助...这对我来说很难...

场景是...1. Presenter 向 DAO 请求用户(本地数据库 - 房间)2.DAO返回一个用户 2.1 如果用户不存在,Presenter向Firebase(Firestore)请求用户3. Presenter 将用户返回到 View。

代码在这里:

[1]道

@Dao
interface PlayersDao {
@Query("SELECT * FROM player WHERE playerName = :playerName")
fun getPlayerByName(playerName: String): Single<Player>
}

[2] 火力基地

class FirebaseDataSource {
private val mFirestore = FirebaseFirestore.getInstance()

override fun getPlayerByName(playerName: String) = Single.create<Player> { emitter ->
mFirestore.collection(PLAYERS)
.whereEqualTo("playerName", playerName)
.get()
.addOnCompleteListener {
if (it.isSuccessful && !it.result.isEmpty) {
emitter.onSuccess(it.result.documents[0].toObject(Player::class.java))
} else {
emitter.onError(PlayerNotExistException())
}
}
}
}

[3] 主持人

fun getPlayer(playerName: String): Single<Player> {
return Single.create { emitter ->
playerDao.getPlayerByName(playerName)
.doOnError {
// When it failed to get the user from local, it should retry to Firebase.
// But I don't know how should I cover this logic.
Single.create<Player> { emitter2 ->
firebaseDataSource.getPlayerByName(playerName)
.doOnError {
Log.d(TAG, "getPlayerByName(firebase) - failed")
}
.doOnSuccess {
emitter.onSuccess(it)
}
}
}
.doOnSuccess {
Log.d(TAG, "getPlayerByName(local) - success")
emitter.onSuccess(it)
}
}
}

当从本地数据库获取用户失败时,我不知道应该如何获取和返回用户。

“单例”是正确的吗?我应该使用“Observable”还是“Flowable”?

<<<------------------------ 这由 Ahmed Ashraf G 清除。

这是一个连续的问题。我修复了如下代码:

主持人

fun getPlayer(playerName: String): Single<Player> {
Log.d(TAG, "getPlayerByName - $playerName")

return playerDao.getPlayerByName(playerName)
.onErrorResumeNext {
Log.d(TAG, "[BS] getPlayerByName(local) - onError: ${it.message}")
playersFirebaseDataSource.getPlayerByName(playerName)
.doOnSuccess {
Log.d(TAG, "getPlayerByName(firebase) - success")
playerDao.savePlayer(it) // Here is run in "Main" thread
}.subscribeOn(Schedulers.io())
}
}

playerDao.savePlayer(it)

这段代码应该在后台线程中。但事实并非如此。我应该怎么做才能修复它?

最佳答案

您正在寻找“onErrorResumeNext”运算符。来自文档:

onErrorResumeNext( ) — instructs an Observable to emit a sequence of items if it encounters an error.

所以它可能看起来像这样:

return playerDao.getPlayerByName(playerName)
.onErrorResumeNext(firebaseDataSource.getPlayerByName(playerName))

这基本上是尝试 DAO 单例,如果遇到错误,它会切换到 FirebaseDataSource 单例。

编辑:您可以在 Here 中找到其他错误处理运算符

编辑 2:至于你的第二个问题,你使用 observeOn 是正确的,它将在特定调度程序上切换工作,但你也使用了 subscribeOn 可以是有害的,这就是为什么 subscribeOn 只能使用一次,它指定您将在其中“观察”可观察对象的线程,它通常与 AndroidSchedulers 一起使用。 mainThread().

我建议通过 Here 阅读有关该主题的更多信息

关于android - 我应该如何在嵌套代码中返回 "Observable/Flowable/Single" "onError"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51427708/

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