Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnErrorNot使用RxJava2和MVI实现异常_Android_Kotlin_Retrofit2_Rx Java2_Mosby - Fatal编程技术网

Android OnErrorNot使用RxJava2和MVI实现异常

Android OnErrorNot使用RxJava2和MVI实现异常,android,kotlin,retrofit2,rx-java2,mosby,Android,Kotlin,Retrofit2,Rx Java2,Mosby,我得到一个OnErrorNotImplementedException抛出,应用程序崩溃,尽管处理了下游的错误(?) 例外情况 E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1 Process: pl.netlandgroup.smartsab, PID: 9920 io.reactivex.exceptions.OnErrorNotImplementedException: HTTP 401 Unauthorized

我得到一个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)
    }
}

我相信该错误是在
getItemsFromResponse()
中抛出的,大致如下:

    val resp0 = getMapResponse()
    resp0.subscribe { size = it.totalCount }
您可以在这里订阅,但不处理错误情况。 实际上这个代码是不正确的,因为你把接收链分成两个独立的部分,你不应该这样做

你应该这样做:

fun getItemsFormResponses(): Observable<List<Item>> {
  return getMapResponse().map { resp0 ->
    val size = resp0.totalCount

    val list = mutableListOf<Observable<List<Item>>>()
    var accum = 0
    do {
      list.add(getMapResponse(accum).map { it.items })
      accum++
    } while (list.size*200 < size)
    return Observable.merge(list)
  }
}
fun getItemsFormResponses():可观察{
返回getMapResponse().map{resp0->
val大小=resp0.totalCount
val list=mutableListOf()
var accum=0
做{
添加(getMapResponse(acum.map{it.items})
累积++
}同时(列表大小*200<大小)
返回可观察的。合并(列表)
}
}

也就是说,通过使用操作符扩展链,而不是使用
subscribe()

解决方案来提取
size
,但在前面的答案中已经显示了获得“OnErrorNotImplementedException”的确切原因是,您可能只使用“onSuccess”消费者进行订阅

您应该添加另一个将处理错误事件的使用者

getMapResponse()
            .subscribe ( 
                     { size = it.totalCount },
                     {/* Do something with the error*/}
            )

“doOnError”不会阻止您获得异常。

我无法立即发现错误。您能否添加演示者的全部stacktrace和全部代码(或者,如果您的项目是开源的,也就是在github上,可以添加指向该项目的链接)?
fun getItemsFormResponses(): Observable<List<Item>> {
  return getMapResponse().map { resp0 ->
    val size = resp0.totalCount

    val list = mutableListOf<Observable<List<Item>>>()
    var accum = 0
    do {
      list.add(getMapResponse(accum).map { it.items })
      accum++
    } while (list.size*200 < size)
    return Observable.merge(list)
  }
}
getMapResponse()
            .subscribe ( 
                     { size = it.totalCount },
                     {/* Do something with the error*/}
            )