如何在RxJava2中的flatMap中进行Throwable调用?(How to do a Throwable call in a flatMap in RxJava2?)
我正在使用RxJava2,我正在做简单的请求,我应该像下一个例子那样做:
getCompositeDisposable().add(subscriptionManager.getSubscriptions(getUserAuth().getToken()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<HttpCustomRes<List<GetSubscriptions>>>() { @Override public void accept(@NonNull HttpCustomRes<List<GetSubscriptions>> listHttpCustomRes) throws Exception { getMvpView().hideLoading(); ErrorCode errorCaught = bypassForErrors(listHttpCustomRes.getError()); if(errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE)) getMvpView().showSubscriptions(listHttpCustomRes.getData()); else if(errorCaught.equals(ErrorCode.INVALID_TOKEN) || errorCaught.equals(ErrorCode.NULL_TOKEN)) getMvpView().showLogin(); else getMvpView().showErrorDialog(); } }, new Consumer<Throwable>() { @Override public void accept(@NonNull Throwable throwable) throws Exception { getMvpView().hideLoading(); getMvpView().showErrorDialog(); } }));
现在,我需要做两个顺序请求,所以我使用flatMap来做这个。 在简单的请求中,我第二次调用方法new Consumer来捕获错误,但是使用flatMap我不知道如何做到这一点。 我在下一行发布代码。
getCompositeDisposable().add(accountUserManager.getUserData(getUserAuth().getToken()).flatMap(new Function<UserData, Flowable<HttpCustomRes<List<GetSubscriptions>>>>() { @Override public Flowable<HttpCustomRes<List<GetSubscriptions>>> apply(@NonNull UserData userData) throws Exception { setUserData(userData); return subscriptionManager.getSubscriptions(getUserAuth().getToken()); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<HttpCustomRes<List<GetSubscriptions>>>() { @Override public void accept(@NonNull HttpCustomRes<List<GetSubscriptions>> listHttpCustomRes) throws Exception { getMvpView().hideLoading(); ErrorCode errorCaught = bypassForErrors(listHttpCustomRes.getError()); if(errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE)) getMvpView().showSubscriptions(listHttpCustomRes.getData()); else if(errorCaught.equals(ErrorCode.INVALID_TOKEN) || errorCaught.equals(ErrorCode.NULL_TOKEN)) getMvpView().showLogin(); else getMvpView().showErrorDialog(); } }, new Consumer<Throwable>() { @Override public void accept(@NonNull Throwable throwable) throws Exception { getMvpView().hideLoading(); getMvpView().showErrorDialog(); } }) );
正如你所看到的,我在第二种方法中有一个throwable,但在第一种方法中没有,所以如果第一次崩溃,应用程序也会崩溃。 我如何实现throwable到第一个请求?
谢谢。
I'm working with RxJava2 and I was doing simple request, I should do it like the next example:
getCompositeDisposable().add(subscriptionManager.getSubscriptions(getUserAuth().getToken()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<HttpCustomRes<List<GetSubscriptions>>>() { @Override public void accept(@NonNull HttpCustomRes<List<GetSubscriptions>> listHttpCustomRes) throws Exception { getMvpView().hideLoading(); ErrorCode errorCaught = bypassForErrors(listHttpCustomRes.getError()); if(errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE)) getMvpView().showSubscriptions(listHttpCustomRes.getData()); else if(errorCaught.equals(ErrorCode.INVALID_TOKEN) || errorCaught.equals(ErrorCode.NULL_TOKEN)) getMvpView().showLogin(); else getMvpView().showErrorDialog(); } }, new Consumer<Throwable>() { @Override public void accept(@NonNull Throwable throwable) throws Exception { getMvpView().hideLoading(); getMvpView().showErrorDialog(); } }));
Now, I need to do two sequential request, so I'm using the flatMap to do this. In the simple request I have the second call to the method new Consumer to catch errors, but with the flatMap I don't know how to do this. I post the code in the next lines.
getCompositeDisposable().add(accountUserManager.getUserData(getUserAuth().getToken()).flatMap(new Function<UserData, Flowable<HttpCustomRes<List<GetSubscriptions>>>>() { @Override public Flowable<HttpCustomRes<List<GetSubscriptions>>> apply(@NonNull UserData userData) throws Exception { setUserData(userData); return subscriptionManager.getSubscriptions(getUserAuth().getToken()); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<HttpCustomRes<List<GetSubscriptions>>>() { @Override public void accept(@NonNull HttpCustomRes<List<GetSubscriptions>> listHttpCustomRes) throws Exception { getMvpView().hideLoading(); ErrorCode errorCaught = bypassForErrors(listHttpCustomRes.getError()); if(errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE)) getMvpView().showSubscriptions(listHttpCustomRes.getData()); else if(errorCaught.equals(ErrorCode.INVALID_TOKEN) || errorCaught.equals(ErrorCode.NULL_TOKEN)) getMvpView().showLogin(); else getMvpView().showErrorDialog(); } }, new Consumer<Throwable>() { @Override public void accept(@NonNull Throwable throwable) throws Exception { getMvpView().hideLoading(); getMvpView().showErrorDialog(); } }) );
As you can see, I have a throwable in the second method, but not in the first, so if the first crash, the app will crash too. How I can implement the throwable to the first request?
Thank you.
原文:https://stackoverflow.com/questions/45009254