- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
尽管在下游处理了错误(?),但我还是抛出了 OnErrorNotImplementedException 并且应用程序崩溃了。
异常
E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1
Process: pl.netlandgroup.smartsab, PID: 9920
io.reactivex.exceptions.OnErrorNotImplementedException: HTTP 401 Unauthorized
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)
at io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onError(ObservableDoOnEach.java:119)
at io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onError(ObservableDoOnEach.java:119)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:56)
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)
at io.reactivex.Observable.subscribe(Observable.java:10838)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
at io.reactivex.Observable.subscribe(Observable.java:10838)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: retrofit2.adapter.rxjava2.HttpException: HTTP 401 Unauthorized
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:54)
at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)
at io.reactivex.Observable.subscribe(Observable.java:10838)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
at io.reactivex.Observable.subscribe(Observable.java:10838)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
改造存储库:
class RetrofitRepository (retrofit: Retrofit) {
val apiService: ApiService = retrofit.create(ApiService::class.java)
var size: Int = 0
fun getMapResponse(pageIndex: Int = 0): Observable<MapResponse> {
return apiService.getMapResponse(pageIndex = pageIndex)
.doOnError { Log.d("error", it.message) }
.doOnNext { Log.d("currThread", Thread.currentThread().name) }
}
fun getItemsFormResponses(): Observable<List<Item>> {
val list = mutableListOf<Observable<List<Item>>>()
val resp0 = getMapResponse()
resp0.subscribe { size = it.totalCount }
var accum = 0
do {
list.add(getMapResponse(accum).map { it.items })
accum++
} while (list.size*200 < size)
return Observable.merge(list)
}
}
Interactor 观察到了这个结果:
class MapInteractor @Inject constructor(private val repository: RetrofitRepository) {
fun getMapItems(): Observable<MapViewState> {
return repository.getItemsFormResponses()
.map {
if(it.isEmpty()) {
return@map MapViewState.EmptyResult()
} else {
val mapItems = it.map { it.toMapItem() }
return@map MapViewState.MapResult(mapItems)
}
}
.doOnNext { Log.d("currThread", Thread.currentThread().name) }
.startWith(MapViewState.Loading())
.onErrorReturn { MapViewState.Error(it) }
}
}
onErrorReturn { MapViewState.Error(it) }
正确发出(就在应用程序崩溃之前我可以看到屏幕上呈现的正确内容)。如何在保持 MVI 架构的同时避免此异常?
编辑
answer provided by dimsuz是正确的解决方案,尽管要实现合并和返回一个包含所有项目的 Observable,它必须修改为:
fun getMapItems(): Observable<List<Item>> {
return getMapResponse().map {
val size = it.totalCount
val list = mutableListOf<Observable<List<Item>>>()
var accum = 0
do {
list.add(getMapResponse(accum++).map { it.items })
} while (list.size*200 < size)
return@map list.zip { it.flatten() }
}.mergeAll()
}
最佳答案
解决方案已在上一个答案中显示,但是您获得“OnErrorNotImplementedException”的确切原因是您可能仅订阅了“onSuccess”消费者。
您应该添加另一个消费者来处理错误事件。
getMapResponse()
.subscribe (
{ size = it.totalCount },
{/* Do something with the error*/}
)
'doOnError' 不会阻止您获得异常。
关于android - 使用 RxJava2 和 Retrofit2 Mosby MVI 的 OnErrorNotImplementedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44921529/
我尝试添加 Mosby library到我的宠物项目,但我不明白如何将它包含到项目中? 我尝试通过添加为模块-> 添加为 Gradle 项目来添加 mosby,但它无法编译。 请给我链接一些教程,如何
我正在寻找一种将基类添加到 mosby 的方法MVP Activity 。让我解释一下我需要什么。 通常在使用 mosby 时我们会声明这样的 Activity : public class Logi
我将 Mosby MVI 库用于一个演示应用程序,该应用程序在我的交互器中使用 Retrofit2 对 Restful API 执行简单的 CRUD 操作。我构建的 ViewStates 与示例应用程
我的演示者如下所示: // I'm retaining the presenter in a singleton instances map and reuse them // because the
我正在使用 Mosby 创建一个小应用程序。 该应用程序有一个我想要绑定(bind)的服务。我想正确的位置是在演示者中。但我实在不知道该怎么做。 我想要存档的是,当服务绑定(bind)时,我想调用它的
我只是创建了一个简单/空白的 fragment ,它应该使用 Mosby 框架。每次我使用 getView() 方法时都会收到错误消息: java.lang.ClassCastException: d
我正在开发一款 Android 应用。我附加的代码正在创建一个回收 View 。我们做的第一件事是创建一个异步任务,它将在 SQLite 数据库上获取数据并将其加载到适配器->recylcerview
我正在使用 Mosby Android 应用程序中的模型- View -Presenter 库。在一个特定的 View 中,我正在使用 Bottom Navigation用 Design Suppor
我正在尝试使用 Mosby 实现一个 MVP Android View(不是 Activity 或 fragment ),但是当在 Android Adaptor 中使用该 View 并在 onBin
我正在尝试在 Android 中实现 MVI 架构,但不想使用 Mosby 库。我想先学习基础知识。 我正在构建一个示例应用程序,当我按下按钮时, TextView 中的文本会发生变化(最初文本是其他
尽管在下游处理了错误(?),但我还是抛出了 OnErrorNotImplementedException 并且应用程序崩溃了。 异常 E/AndroidRuntime: FATAL EXCEPTION
我正在尝试理解 MvP 设计模式的概念。我的意思是,我明白了,这很容易。主要问题是最佳实现。我试图制作自己的 BaseActivity、BasePresenter 和 BaseView,只是为了从我的
我正在尝试在 Dagger 2 中使用 Mosby 的 MvpBasePresenter 设置一个 Base Presenter 我有以下基本组件: public interface BaseView
我是一名优秀的程序员,十分优秀!