首页 \ 问答 \ 如何在RxJava2中的flatMap中进行Throwable调用?(How to do a Throwable call in a flatMap in RxJava2?)

如何在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
更新时间:2023-05-22 17:05

相关文章

更多

最新问答

更多
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • 电脑高中毕业学习去哪里培训
  • 电脑系统专业就业状况如何啊?
  • IEnumerable linq表达式(IEnumerable linq expressions)
  • 如何在Spring测试中连接依赖关系(How to wire dependencies in Spring tests)
  • Solr可以在没有Lucene的情况下运行吗?(Can Solr run without Lucene?)
  • 如何保证Task在当前线程上同步运行?(How to guarantee that a Task runs synchronously on the current thread?)
  • 在保持每列的类的同时向数据框添加行(Adding row to data frame while maintaining the class of each column)
  • 的?(The ? marks in emacs/haskell and ghc mode)
  • 一个线程可以调用SuspendThread传递自己的线程ID吗?(Can a thread call SuspendThread passing its own thread ID?)
  • 延迟socket.io响应,并“警告 - websocket连接无效”(Delayed socket.io response, and “warn - websocket connection invalid”)
  • 悬停时的图像转换(Image transition on hover)
  • IIS 7.5仅显示homecontroller(IIS 7.5 only shows homecontroller)
  • 没有JavaScript的复选框“关闭”值(Checkbox 'off' value without JavaScript)
  • java分布式框架有哪些
  • Python:填写表单并点击按钮确认[关闭](Python: fill out a form and confirm with a button click [closed])
  • PHP将文件链接到根文件目录(PHP Linking Files to Root File Directory)
  • 我如何删除ListView中的项目?(How I can remove a item in my ListView?)
  • 您是否必须为TFS(云)中的每个BUG创建一个TASK以跟踪时间?(Do you have to create a TASK for every BUG in TFS (Cloud) to track time?)
  • typoscript TMENU ATagParams小写(typoscript TMENU ATagParams lowercase)
  • 武陟会计培训类的学校哪个好点?
  • 从链接中删除文本修饰(Remove text decoration from links)