在Rx订阅服务器内启动活动

时间:2016-02-26 17:24:45

标签: android rx-java reactive-programming rx-android

当我收到来自后端的回复时,我们正在尝试处理错误。如果响应成功,我们将开始一个新活动,另一方面,如果响应不成功,我们将调用onError方法。

我们感觉我们没有正确处理生命周期,因为我们打开了一个新活动,我们的订阅被取消订阅,因此我们不会正确地解除对话。我们是否应该在订阅者内部类中存储变量以在onComplete中请求该变量,并在该方法中启动新活动?或者这种近似是否足够好?

mem::replace

此外,我们是否以正确的方式处理onError流程?我们知道从onNext调用onError会导致调用Error并在调用onComplete之后调用。我们应该在onError方法上取消订阅订阅者吗?

我们找到了订阅者的包装器:

Subscriber<BackendResponse> subscriber = new Subscriber<BackendResponse>() {
        @Override
        public void onCompleted() {
            progressDialog.dismiss();
        }

        @Override
        public void onError(Throwable exception) {
            progressDialog.dismiss();
            SnackbarNotification.show(coordinatorLayout, "Error");
        }

        @Override
        public void onNext(BackendResponse backendResponse) {
            if (backendResponse.getSuccess()){
                startActivity(new Intent(LoginActivity.this, HomeActivity.class));
            } else {
                onError(new Exception("Launch onError"));
            }
        }
    };

这样做,我们将onNext提供的结果存储在成员变量中。一旦流完成(只有一次迭代),我们在onCompleted中调用onSuccess(result)。另一方面,我们在onFailure方法中处理onError。你觉得怎么样?我们错过了什么吗?

1 个答案:

答案 0 :(得分:2)

首先,我不会检查订阅者中的backendResponse.getSuccess()。我希望在它之前添加一个步骤,例如与.flatMap类似:

//your observable
.flatMap(backendResponse - > {
   if (backendResponse.getSuccess()){
     return just(backendResponse);
   }else{
     return Observable.error(new Exception("Launch onError"));
   }
})

此外,我会订阅:

.flatMap (  ...  ) // the flatmap above
.subscribe(new Subscriber<BackendResponse>() {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable exception) {
            progressDialog.dismiss();
            SnackbarNotification.show(coordinatorLayout, "Error");
        }

        @Override
        public void onNext(BackendResponse backendResponse) {
            progressDialog.dismiss();
            startActivity(new Intent(LoginActivity.this, HomeActivity.class));
        }
    });

这会产生一个小故障还是你想要的?我假设你只会收到一个BackendResponse事件。

但是如果你只需要在observable完成时保留你的逻辑,那么我会看到两个解决方案:

  • 移动HomeActivity中的进度对话框逻辑
  • 延长订阅的生命周期(注意不要泄漏订阅)