0

我是RxJava的新手,仍然在探索它的奇蹟。rxjava - 如何處理地圖內的異常()

我改造Response對象爲使用map()運營商LoginSession對象,但可以有轉變過程中引發的IOException。以下是示例代碼。

可觀察

public Observable<LoginSession> login(@NonNull String username, @NonNull String password) { 
     return Observable.create(new Observable.OnSubscribe<Response>() { 
      @Override 
      public void call(Subscriber<? super Response> subscriber) { 
       loginInternal(username, password, subscriber); 
      } 
     }).map(response -> { 
      try { 
       LoginSession session = Utils.methodThatCanReturnAnIoException(response.body().byteStream(), LoginSession.class); 
       return session; 
      } catch(IOException e){ 
       return null; // what should I do here ???? 
      } 
     }).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()); 
    } 

用戶

login("username", "password").subscribe(loginSession -> { 
    //i hate checking for null here. there should be a better way... 
    if(loginSession != null){ 
     Log.d("MY_SESSION", "Login session successful."); 
    } else { 
     Log.d("MY_SESSION", "Login Session is null unfortunately."); 
    } 
}); 

什麼是處理這種情況的最好方法是什麼?除了檢查subscribe()中的空值,我肯定不是最好的做法。

+0

過濾掉空值。 –

+1

至於另一個,將地圖更改爲平面地圖,在Observable.create()或Observable.defer()中進行操作並處理那裏的錯誤。 –

+0

但我希望訂閱者知道發生了錯誤。 filter()用戶永遠不會知道轉換失敗。 –

回答

3

你後的圖案是用flatMap

public Observable<LoginSession> login(@NonNull String username, @NonNull String password) { 
     return Observable.create(new Observable.OnSubscribe<Response>() { 
      @Override 
      public void call(Subscriber<? super Response> subscriber) { 
       loginInternal(username, password, subscriber); 
      } 
     }).flatMap(response -> { 
      try { 
       LoginSession session = Utils.methodThatCanReturnAnIoException(response.body().byteStream(), LoginSession.class); 
       return Observable.just(session); 
      } catch(IOException e){ 
       return Observable.error(e); 
      } 
     }).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()); 
    } 

然後使用onError方法在訂戶。

+0

是的,我試過flatMap,這適用於這種情況:)。接受這個答案。 –