Android 在接收用户内启动活动
当我从后端收到响应时,我们正在尝试处理错误。如果响应成功,我们将启动一个新的活动,另一方面,如果响应不成功,我们将调用onError方法 我们感觉我们没有正确地处理生命周期,因为我们打开了一个新的活动,我们的订阅被取消,所以我们没有正确地关闭对话框。我们是否应该在subscriber内部类中存储一个变量,以便在onComplete中请求该变量,并在该方法中启动新活动?或者这个近似值足够好Android 在接收用户内启动活动,android,rx-java,reactive-programming,rx-android,Android,Rx Java,Reactive Programming,Rx Android,当我从后端收到响应时,我们正在尝试处理错误。如果响应成功,我们将启动一个新的活动,另一方面,如果响应不成功,我们将调用onError方法 我们感觉我们没有正确地处理生命周期,因为我们打开了一个新的活动,我们的订阅被取消,所以我们没有正确地关闭对话框。我们是否应该在subscriber内部类中存储一个变量,以便在onComplete中请求该变量,并在该方法中启动新活动?或者这个近似值足够好 Subscriber<BackendResponse> subscriber = new Sub
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"));
}
}
};
Subscriber=newsubscriber(){
@凌驾
未完成的公共无效(){
progressDialog.disclose();
}
@凌驾
公共无效报告人(可丢弃的例外情况){
progressDialog.disclose();
SnackbarNotification.show(协调布局,“错误”);
}
@凌驾
public void onNext(BackendResponse BackendResponse){
if(backendResponse.getSuccess()){
startActivity(新意图(LoginActivity.this、HomeActivity.class));
}否则{
onError(新的例外(“启动onError”);
}
}
};
此外,我们是否以正确的方式处理onError流程?我们知道,从onNext调用onError将导致调用onError,然后调用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);
}
公共抽象类DefaultSubscriber扩展订阅服务器{
保护T结果;
@凌驾
未完成的公共无效(){
成功(结果);
}
@凌驾
公共无效申报人(可丢弃的e){
CustomLog.e(“onError”,e.getMessage());
失败(e);
}
@凌驾
下一页(T){
结果=t;
}
成功时受保护的抽象无效(T);
失效时受保护的抽象无效(可丢弃的异常);
}
这样,我们将onNext提供的结果存储在一个成员变量中。一旦流完成(只有一次迭代),我们在onCompleted中调用onSuccess(result)。另一方面,我们在onFailure方法中处理onError。你觉得怎么样?我们遗漏了什么吗?所以首先我不会检查订阅服务器中的
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));
}
});
.flatMap(…)//上面的flatMap
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效报告人(可丢弃的例外情况){
progressDialog.disclose();
SnackbarNotification.show(协调布局,“错误”);
}
@凌驾
public void onNext(BackendResponse BackendResponse){
progressDialog.disclose();
startActivity(新意图(LoginActivity.this、HomeActivity.class));
}
});
这会造成小故障还是你想要的?我假设您将只收到一个BackendResponse
事件
但是,如果您只需要在observable完成时保持逻辑,那么我看到两种解决方案:
- 在HomeActivity中移动进度对话框逻辑
- 延长订阅的生命周期(小心不要泄露订阅)
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));
}
});
.flatMap(…)//上面的flatMap
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效报告人(可丢弃的例外情况){
progressDialog.disclose();
SnackbarNotification.show(协调布局,“错误”);
}
@凌驾
public void onNext(BackendResponse BackendResponse){
progressDialog.disclose();
startActivity(新意图(LoginActivity.this、HomeActivity.class));
}
});
这会造成小故障还是你想要的?我假设您将只收到一个BackendResponse
事件
但是,如果您只需要在observable完成时保持逻辑,那么我看到两种解决方案:
- 在HomeActivity中移动进度对话框逻辑
- 延长订阅的生命周期(小心不要泄露订阅)