android - How to handle exception thrown when trying to propagate error to Observer.onError? -


i'm creating app rxjava, rxandroid , retrofit2. query retrofit2:

@post("auth/sign_in") observable<response<accountentity>> signin(@header("email") string email, @header("password") string password); 

the observable make login api:

public observable<accesstoken> signin(string user, string pass) {     return netservice.signin(user, pass).flatmap(new func1<response<accountentity>, observable<accesstoken>>() {         @override         public observable<accesstoken> call(final response<accountentity> accountentityresponse) {              accountentity accountentity = accountentityresponse.body();             diskaccountdatastore.createaccount(accounttoaccountentitymapper.reversemap(accountentity)).subscribe();              return observable.create(new observable.onsubscribe<accesstoken>() {                 @override                 public void call(subscriber<? super accesstoken> subscriber) {                     accesstoken accesstoken = new accesstoken.accestokenbuilder()                             .accesstoken(accountentityresponse.headers().get(accesstoken.access_token))                             .tokentype(accountentityresponse.headers().get(accesstoken.token_type))                             .client(accountentityresponse.headers().get(accesstoken.client))                             .expiry(accountentityresponse.headers().get(accesstoken.expiry))                             .uid(accountentityresponse.headers().get(accesstoken.uid))                             .build();                      subscriber.onnext(accesstoken);                 }             });         }     }); } 

and subscriber:

private final class signinsubscriber extends defaultsubscriber<accesstoken> {     @override     public void oncompleted() {         super.oncompleted();     }      @override     public void onerror(throwable e) {         super.onerror(e);         if (e instanceof httpexception) {             responsebody responsebody = ((httpexception) e).response().errorbody();             getview().signinerror(geterrormessage(responsebody));         } else if (e instanceof sockettimeoutexception)             getview().signinerror("connection timeout");         else if (e instanceof ioexception)             getview().signinerror("network error");         else             getview().signinerror("wrong credentials");      }      @override     public void onnext(accesstoken token) {         super.onnext(token);         getview().signinsuccess(token);     }      private string geterrormessage(responsebody responsebody) {         try {             jsonobject jsonobject = new jsonobject(responsebody.string());             return jsonobject.getstring("errors");         } catch (exception e) {             return e.getmessage();         }     } } 

this code works fine, throws exception crash app, log. i've tried many ways handle still failling. understand means tried call onerror method thrown irrecuperable error.:

fatal exception: main process: com.app, pid: 26813 java.lang.illegalstateexception: fatal exception thrown on scheduler.worker thread. @    rx.android.schedulers.looperscheduler$scheduledaction.run(looperscheduler.java:114) @ android.os.handler.handlecallback(handler.java:739) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:158) @ android.app.activitythread.main(activitythread.java:7224) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1230) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1120)  caused by: rx.exceptions.onerrorfailedexception: error occurred when trying propagate error observer.onerror @ rx.observers.safesubscriber._onerror(safesubscriber.java:187) @ rx.observers.safesubscriber.onerror(safesubscriber.java:115) @ rx.internal.operators.operatorobserveon$observeonsubscriber.checkterminated(operatorobserveon.java:273) @ rx.internal.operators.operatorobserveon$observeonsubscriber.call(operatorobserveon.java:216) @ rx.android.schedulers.looperscheduler$scheduledaction.run(looperscheduler.java:107) @ android.os.handler.handlecallback(handler.java:739)  @ android.os.handler.dispatchmessage(handler.java:95)  @ android.os.looper.loop(looper.java:158)  @ android.app.activitythread.main(activitythread.java:7224)  @ java.lang.reflect.method.invoke(native method)  @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1230)  @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1120)   caused by: rx.exceptions.compositeexception: 2 exceptions occurred.  @ rx.observers.safesubscriber._onerror(safesubscriber.java:187)  @ rx.observers.safesubscriber.onerror(safesubscriber.java:115)  @ rx.internal.operators.operatorobserveon$observeonsubscriber.checkterminated(operatorobserveon.java:273)  @ rx.internal.operators.operatorobserveon$observeonsubscriber.call(operatorobserveon.java:216)  @ rx.android.schedulers.looperscheduler$scheduledaction.run(looperscheduler.java:107)  @ android.os.handler.handlecallback(handler.java:739)  @ android.os.handler.dispatchmessage(handler.java:95)  @ android.os.looper.loop(looper.java:158)  @ android.app.activitythread.main(activitythread.java:7224)  @ java.lang.reflect.method.invoke(native method)  @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1230)  @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1120)   caused by: rx.exceptions.compositeexception$compositeexceptioncausalchain: chain of causes compositeexception in order received => @ android.util.log.getstacktracestring(log.java:508) @ com.android.internal.os.runtimeinit.clog_e(runtimeinit.java:60) @ com.android.internal.os.runtimeinit.access$200(runtimeinit.java:44) @ com.android.internal.os.runtimeinit$uncaughthandler.uncaughtexception(runtimeinit.java:92) @ java.lang.threadgroup.uncaughtexception(threadgroup.java:693) @ java.lang.threadgroup.uncaughtexception(threadgroup.java:690) @ rx.android.schedulers.looperscheduler$scheduledaction.run(looperscheduler.java:118) @ android.os.handler.handlecallback(handler.java:739)  @ android.os.handler.dispatchmessage(handler.java:95)  @ android.os.looper.loop(looper.java:158)  @ android.app.activitythread.main(activitythread.java:7224)  @ java.lang.reflect.method.invoke(native method)  @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1230)  @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1120)   caused by: java.net.sockettimeoutexception @ java.net.plainsocketimpl.read(plainsocketimpl.java:484) @ java.net.plainsocketimpl.access$000(plainsocketimpl.java:37) @ java.net.plainsocketimpl$plainsocketinputstream.read(plainsocketimpl.java:237) @ okio.okio$2.read(okio.java:139) @ okio.asynctimeout$2.read(asynctimeout.java:237) @ okio.realbufferedsource.indexof(realbufferedsource.java:345) @ okio.realbufferedsource.readutf8linestrict(realbufferedsource.java:217) @ okio.realbufferedsource.readutf8linestrict(realbufferedsource.java:211) @ okhttp3.internal.http1.http1codec.readresponseheaders(http1codec.java:189) @ okhttp3.internal.http.callserverinterceptor.intercept(callserverinterceptor.java:75) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:92) @ okhttp3.internal.connection.connectinterceptor.intercept(connectinterceptor.java:45) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:92) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:67) @ okhttp3.internal.cache.cacheinterceptor.intercept(cacheinterceptor.java:93) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:92) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:67) @ okhttp3.internal.http.bridgeinterceptor.intercept(bridgeinterceptor.java:93) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:92) @ okhttp3.internal.http.retryandfollowupinterceptor.intercept(retryandfollowupinterceptor.java:120) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:92) @ okhttp3.internal.http.realinterceptorchain.proceed(realinterceptorchain.java:67) @ okhttp3.realcall.getresponsewithinterceptorchain(realcall.java:185) @ okhttp3.realcall.execute(realcall.java:69) @ retrofit2.okhttpcall.execute(okhttpcall.java:180) @ retrofit2.adapter.rxjava.rxjavacalladapterfactory$requestarbiter.request(rxjavacalladapterfactory.java:171) @ rx.subscriber.setproducer(subscriber.java:211) @ rx.interna 


Comments

Popular posts from this blog

What is happening when Matlab is starting a "parallel pool"? -

angular - DownloadURL return null in below code -

php - Cannot override Laravel Spark authentication with own implementation -