2015-04-04 50 views
0

我運行下面的代碼:RxJava - 調試鏈似乎永遠阻塞

List<GroupedObservable<BcxToDoList, BcxToDo>> mToDoList; 

mToDoList = bcxClient 
    .fetchToDos() 
    .flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() { 
    @Override 
    public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) { 
     return Observable.from(bcxToDos); 
    } 
    }) 
    .groupBy(new Func1<BcxToDo, BcxToDoList>() { 
    @Override 
    public BcxToDoList call(BcxToDo bcxToDo) { 
     return bcxToDo.toDoList; 
    } 
    }) 
    .toList() 
    .toBlocking() 
    .single(); 

當我踏進這個代碼Android Studio中,代碼塊下去。如果我使用subscribe()來捕獲它,則沒有例外。

什麼是調試正在進行的最佳方式?

UPDATE

繼@ dwursteisen的建議下,我用.doOnNext()看到.groupBy()被髮射的。它正在創建我期望的輸出,它從未發送onCompleted通知。

根據thesetickets,在RxJava這是設計。必須處理每個GroupedObservable以便toList運算符工作。

因此,這裏是我的修改後的代碼:

List<BcxToDoList> mToDoList; 

mToDoList = bcxClient 
    .fetchToDos() 
    .flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() { 
    @Override 
    public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) { 
     return Observable.from(bcxToDos); 
    } 
    }) 
    .groupBy(new Func1<BcxToDo, BcxToDoList>() { 
    @Override 
    public BcxToDoList call(BcxToDo bcxToDo) { 
     return bcxToDo.toDoList; 
    } 
    }) 
    .flatMap(new Func1<GroupedObservable<BcxToDoList, BcxToDo>, Observable<BcxToDoList>>() { 
    @Override 
    public Observable<BcxToDoList> call(final GroupedObservable<BcxToDoList, BcxToDo> bcxToDoListBcxToDoGroupedObservable) { 
     return bcxToDoListBcxToDoGroupedObservable 
     .toList() 
     .flatMap(new Func1<List<BcxToDo>, Observable<BcxToDoList>>() { 
      @Override 
      public Observable<BcxToDoList> call(List<BcxToDo> bcxToDos) { 
      bcxToDoListBcxToDoGroupedObservable.getKey().toDos.addAll(bcxToDos); 

      return Observable.just(bcxToDoListBcxToDoGroupedObservable.getKey()); 
      } 
     }); 
    } 
    }) 

    .toList() 

    .toBlocking() 
    .single(); 

不太優雅的第一個代碼段,但至少它不再塊!如果有什麼我可以做的,使新的代碼片段更具可讀性,我會很感激任何建議。

回答

1

使用RxJava進行調試可能會很棘手。

您可以添加.doOnNext()調用,這將允許您顯示RxJava通知並查看會發生什麼。

根據你的代碼,我認爲你的代碼塊在使用toList操作符時只會在Observable完成時纔會發出。

我認爲你的流沒有完成,所以toList永遠不會發射,然後你的代碼塊永遠。

+0

我認爲你是對的,如果我刪除GROUPBY,然後代碼工作。使用groupBy,doOnNext會被調用兩次(這是正確的計數),但是會被阻塞。那麼爲什麼這個團隊不會發送一個完整的事件呢? – Mitkins 2015-04-04 11:53:29

+0

找到阻塞的原因 - https://github.com/ReactiveX/RxJava/issues/844。根據這張票,每個GroupedObservables必須訂閱 – Mitkins 2015-04-04 13:17:46

1

SO answer提供調試RxJava正確的方法:

現在我無法重現的問題,但我發現rxdebug的Java調試一個 很好的工具。

它的使用很簡單:添加庫作爲依賴,並在應用 開始註冊一個監聽器:

RxJavaPlugins.getInstance().registerObservableExecutionHook(new DebugHook(new DebugNotificationListener() { 
    public Object onNext(DebugNotification n) { 
     Log.v(TAG,"onNext on "+n); 
     return super.onNext(n); 
    } 


    public Object start(DebugNotification n) { 
     Log.v(TAG,"start on "+n); 
     return super.start(n); 
    } 


    public void complete(Object context) { 
     super.complete(context); 
     Log.v(TAG,"onNext on "+context); 
    } 

    public void error(Object context, Throwable e) { 
     super.error(context, e); 
     Log.e(TAG,"error on "+context); 
    } 
}));