Android 在接收用户内启动活动

Android 在接收用户内启动活动,android,rx-java,reactive-programming,rx-android,Android,Rx Java,Reactive Programming,Rx Android,当我从后端收到响应时,我们正在尝试处理错误。如果响应成功,我们将启动一个新的活动,另一方面,如果响应不成功,我们将调用onError方法 我们感觉我们没有正确地处理生命周期,因为我们打开了一个新的活动,我们的订阅被取消,所以我们没有正确地关闭对话框。我们是否应该在subscriber内部类中存储一个变量,以便在onComplete中请求该变量,并在该方法中启动新活动?或者这个近似值足够好 Subscriber<BackendResponse> subscriber = new Sub

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

我们感觉我们没有正确地处理生命周期,因为我们打开了一个新的活动,我们的订阅被取消,所以我们没有正确地关闭对话框。我们是否应该在subscriber内部类中存储一个变量,以便在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"));
            }
        }
    };
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中移动进度对话框逻辑
  • 延长订阅的生命周期(小心不要泄露订阅)