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
Post a Comment