2016-02-26 39 views
0

我收到来自后端的响应时试图处理错误。如果响应成功,我们开始一个新的活动,另一方面,如果响应不成功,我们调用onError方法。Rx用户内的开始活动

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

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(result)。另一方面,我们在onFailure方法中处理onError。你对此有何看法?我们错过了什么吗?

回答

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事件。

不过,如果你需要保持你的逻辑,只有当观察到完成,然后我看到了两个解决方案:

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