【发布时间】:2016-06-10 00:55:26
【问题描述】:
当我收到来自后端的响应时,我们正在尝试处理错误。如果响应成功,我们开始一个新的活动,另一方面,如果响应不成功,我们调用 onError 方法。
我们感觉我们没有正确处理生命周期,因为我们打开了一个新活动,我们的订阅被取消订阅,所以我们没有正确关闭对话框。我们是否应该在订阅者内部类中存储一个变量以在 onComplete 中请求该变量,并在该方法中启动新活动?或者这个近似值就足够了?
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"));
}
}
};
此外,我们是否以正确的方式处理 onError 流程?我们知道从 onNext 调用 onError 将导致调用 Error 并在调用 onComplete 之后调用。我们应该取消订阅 onError 方法的订阅者吗?
我们为订阅者找到了一个包装器:
public abstract class DefaultSubscriber<T> extends Subscriber<T> {
protected T result;
@Override
public void onCompleted() {
onSuccess(result);
}
@Override
public void onError(Throwable e) {
CustomLog.e("onError", e.getMessage());
onFailure(e);
}
@Override
public void onNext(T t) {
result = t;
}
protected abstract void onSuccess(T t);
protected abstract void onFailure(Throwable exception);
}
这样做,我们将 onNext 提供的结果存储在成员变量中。一旦流完成(只有一次迭代),我们在 onCompleted 内部调用 onSuccess(结果)。另一方面,我们在 onFailure 方法中处理 onError。你怎么看?我们错过了什么吗?
【问题讨论】:
标签: android rx-java reactive-programming rx-android