2016-02-26 59 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
  • 延長訂閱的生命週期(注意不要以泄漏訂閱)