当我收到来自后端的回复时,我们正在尝试处理错误。如果响应成功,我们将开始一个新活动,另一方面,如果响应不成功,我们将调用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。你觉得怎么样?我们错过了什么吗?
答案 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完成时保留你的逻辑,那么我会看到两个解决方案: