当前位置: 首页 > 知识库问答 >
问题:

RxAndroid呼叫一个又一个网络呼叫

姬向明
2023-03-14

我是RXJava的新手。在一个场景中,我希望调用第一个登录webservice(GetLoginObservable),如果成功,则希望调用另一个webservice(GetFetchDataObservable)以获取用户信息。

private void doLogin() {
    emailAddress = editTextUsername.getText().toString();
    final String password = editTextPassword.getText().toString();
    showProgress(null, getString(R.string.loggingInPleaseWait));

    getLoginObservable(editTextUsername.getText().toString(), password)
            .map(response -> {
                if (response.result) {
                    getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
                }
                return response;
            })
            .flatMap(response -> {
                return getFetchDataObservable();
            })
            .subscribe(res -> {
                dismissProgress();
                if (res.result) {
                    saveInformation(password, res);
                } else {
                    ConstantsMethods.showOkButtonDialog(getContext(), res.message, null);
                }
            }, e -> {
                dismissProgress();
                if (e instanceof NoInternetConnectionException) {
                    ConstantsMethods.showOkButtonDialog(getContext(), getString(R.string.noInternetConnection), null);
                }
                Log.e(LoginFragment.class.getSimpleName(), e.getMessage());
            });
}



    private Observable<WsResponse<SecurityQuestion>> getLoginObservable(String userName, String password) {
        return Observable.<WsResponse<SecurityQuestion>>create(subscriber -> {
            getPresenter().doLogin(getActivity(), userName, password, appType,
                    new Callback<Void, WsResponse<SecurityQuestion>>() {
                        @Override
                        public Void callback(final WsResponse<SecurityQuestion> param) {
                            subscriber.onNext(param);
                            return null;
                        }
                    });
        });
    }

    private Observable<WsResponse<PatientDataProfile>> getFetchDataObservable() {
        return Observable.create(subscriber -> {
            new AfPatientsPresenter().fetchPatientData(getContext(), emailAddress, "", new Callback<Void, WsResponse<PatientDataProfile>>() {
                @Override
                public Void callback(WsResponse<PatientDataProfile> param1) {
                    subscriber.onNext(param1);
                    subscriber.onComplete();
                    return null;
                }
            });
        });
    }

共有1个答案

邵崇凛
2023-03-14

而不是:

.map(response -> {
                if (response.result) {
                    getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
                }
                return response;
            })

您可以使用:

flatMap(response-> {
    if (response.result) {
        getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
        return Observable.just(response);
    } else {
        return Observable.error(new Exception("Login failed")); // or maybe some LoginFailedException() you can reuse
    }
})
 类似资料:
  • 问题内容: 我想使用Mockito测试下面的(简化)代码。我不知道如何告诉Mockito第一次失败,然后第二次成功。 我可以通过以下方式设置成功测试: 以及失败测试: 但是,如何测试一次失败(或两次)然后成功,就可以了吗? 问题答案: 从文档: 有时,对于同一方法调用,我们需要对不同的返回值/异常进行存根。典型的用例可能是模拟迭代器。Mockito的原始版本没有此功能来促进简单的模拟。例如,可以使

  • 问题内容: 一个非常简单的小问题,但是我不太明白该怎么做。 我需要将’_’的每个实例替换为空格,并将’#’的每个实例替换为空/空。 我已经试过了: 我真的不喜欢这样的链接命令。还有另一种方法可以做到这一点吗? 问题答案: 使用OR运算符(): 您还可以使用字符类: Fiddle 如果您想用一件事替换哈希值,而用另一件事替换下划线,则只需要链接即可。但是,您可以添加一个原型: 但是为什么不连锁呢?我

  • 如果使用基于回调的异步测试,如果done()多次调用Mocha,则会抛出错误。这对于捕获意外的双重回调非常方便。 it('double done', function(done) { // Calling `done()` twice is an error setImmediate(done); setImmediate(done); }); 运行上面的测试将给出以下错误消息: $ ./nod

  • 我在调用我的onLeScan时遇到问题。我在开始扫描中放置了一个标签,每次都会被调用。出于某种原因,我的onLeScan永远不会被调用。有人看到我所做的有问题吗?onLeScan应该在开始扫描后立即调用,对吗? 编辑更改了我的onLeScan函数。仍然不起作用,但我认为我正在走向正确的道路。DeviceBeacon是一个只包含方法的类:getName()、getSignal()和getAddres

  • 1、接口声明 如果您希望在自己的CRM系统嵌入呼叫中心能力,需要对接智齿呼叫中心能力,在对接前请您阅读如下对接流程,以便您更好的完成对接。如果只对接基本呼叫能力,预计对接及调试过程1周左右即可完成。 第一步:获取第三方用户接口调用唯一凭证 请联系您的售后经理,获取您企业的如下信息: 1、companyid(企业id) 2、appid(第三方用户接口调用唯一凭证id) 3、app_key(第三方用户