- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我试图用RxJava在android中实现MVI模式,但是我想在某种状态下处理抛出的error
以及成功和加载,无论如何都可以处理错误而不是subscribe(onError = xxx)
处理
sealed class AuthResult : MviResult {
sealed class LoadUserResult : AuthResult() {
object Loading : LoadUserResult()
data class Success(val user: User) : LoadUserResult()
data class Fail(val error: Throwable) : LoadUserResult()
}
}
private val loadUser =
ObservableTransformer<LoadUserAction, LoadUserResult> { actions ->
actions.flatMap {
userManager.getCurrentUser()
.map<LoadUserResult> { LoadUserResult.Success(it) }
.onErrorReturn(LoadUserResult::Fail) // HERE? // EDIT FOR THE ANSWER: REMOVE THIS
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.startWith(LoadUserResult.Loading)
}.onErrorReturn(LoadUserResult::Fail) // ANSWER: ADD THIS TO CATCH API ERROR
}
var actionProcess =
ObservableTransformer<AuthAction, AuthResult> { actions ->
actions.publish { s->
Observable.merge(
s.ofType(LoadUserAction::class.java).compose(loadUser),
s.ofType(SignInWithGoogleAction::class.java).compose(signInWithGoogle)
)
}
}
fun combine(): Observable<AuthViewState> {
return _intents
.map(this::actionFromIntent)
.compose(actionProcess)
.scan(AuthViewState.idle(), reducer)
.distinctUntilChanged()
.replay(1)
.autoConnect(0)
}
disposable.add(viewModel.combine().subscribe(this::response))
private fun response(state: AuthViewState) {
val user = state.user
if (user.uid.isBlank() && user.email.isBlank() && user.username.isBlank()) {
Timber.i("user: $user")
} else {
Timber.i("user: $user")
Toast.makeText(requireContext(), "Will navigate to MainActivity", Toast.LENGTH_SHORT)
.show()
}
// HANDLE THE ERROR HERE?
if (state.error != null) {
Toast.makeText(requireContext(), "Error fetching user", Toast.LENGTH_SHORT).show()
Timber.e("Error loading user ${state.error.localizedMessage}")
}
}
2020-06-03 22:42:15.073 25060-25060/com.xxx W/System.err: io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 10:
最佳答案
您在此处收到的错误是由于您在.subscribe()
中调用Fragment
引起的。该.subscribe()
的变体(仅接受一个参数的变体-onNext
消费者回调)将仅在流成功发出项目(在本例中为AuthViewState
)时通知消费者。但是,当您可观察的流遇到错误时,RxJava没有处理它的好方法,因为.subscribe()
中没有提供错误回调。因此,它引发您在上面遇到的错误。
注意:RxJava具有Observable.subscribe()
的许多重载,其中有些接受消费者回调以进行错误处理。
但是,如果您的目标是使Observable
始终成功发出AuthViewState
,即使遇到错误,您也可以使用Observable.onErrorReturn()
(或RxJava提供的类似错误处理功能)。一个示例用法是:
sealed class ViewState {
object Loading : ViewState()
data class Success(val username: String) : ViewState()
data class Error(val error: Throwable) : ViewState()
}
class UserProfileViewModel(
private val userService: UserService
) {
fun getViewState(): Observable<ViewState> {
return Observable
.merge(
Observable.just(ViewState.Loading),
userService
.getUserFromApi()
.map { user -> ViewState.Success(user.username) }
)
.onErrorReturn { error -> ViewState.Error(error) }
}
}
关于android - 处理RxJava的onErrorReturn和OnErrorNotImplementedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62176336/
我有 public Single getPayment(Identity identity, String id) { return client.getPayment(identity, i
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this qu
我有以下代码: public Single doSomething(Post post) { String endPoint = "some-url"; JsonObject payl
我在 flowable 中抛出了两个异常,并使用 onErrorReturn 来捕获这些异常。但我发现只捕获了第一个异常。如何捕获所有异常? Flowable.create(emitter -> {
我做了这些单元测试,结果根本不是我预期的: // This one outputs "subscribe.onError" @Test public void observable_doOnError
这是代码: import io.reactivex.Observable; import io.reactivex.Observer; import org.junit.jupiter.api.Tes
当我编写不同的 RxJava 运算符时,我遇到了转换问题, 这是我的方法: public Single> doWork() { return calculate() // .map(...
当我从 MainViewModel 调用 Retrofit 方法 GetTodoRepository.fetchTodo() 并且调用以失败或任何非成功结果结束时,我想让 RxJava两者都执行 on
我是一名优秀的程序员,十分优秀!