2017-04-10 83 views
1

在rxJava 1.x中有可能做這樣的事情:也返回Observable<Foo>訂閱同一用戶在rxJava 2

我無法找到同樣的方法

Observable.<Foo>create(subscriber -> { 
    ... 
    getNewObservable().subscribe(Subscribers.wrap(subscriber)); 
}) 

GetNewObservable()在rxJava中2.在Observable對象上沒有接受Emitter或ObservableEmitter的訂閱方法。我想我可以做這樣的事情:

Observable.<Foo>create((ObservableEmitter<Foo> emitter) -> { 
    ... 
    getNewObservable().subscribe(emitter::onNext, emitter::onError, emitter::onComplete); 
}) 

但我不知道是否有像rxJava 1

由於一些更直接的方式。

+0

究竟什麼是你想達到這種不明顯的方法呢?必須有更清潔的方式來做到這一點。請描述你的代碼的目的。 –

+0

當然,可能有更多的方法來解決這個問題,但我很好奇rxJava 2中是否真的沒有等價物。這種方法實際上在[Rex Programming with RxJava]中提到過(http://shop.oreilly.com /product/0636920042228.do)書。 但回到我的情況我正在做android lib,我希望有可觀察到的女巫會每x分鐘做一些動作。所以我有一個可觀測的計時器。但「工作」需要授予一些權限。我只是想首先檢查權限,並且只有在訂閱計時器可觀察時纔可以。否則返回onError ... – bio007

+0

那麼如何:'if(permissionGranted)return Observable.interval(...)。map(...);否則返回Observable.error(...);'? –

回答

0

1)這樣做的一種方式是你在註釋中描述:

Observable.interval(...) 
    .map(n -> { 
      if (!permissionGranted) 
       throw new AccessDeniedException(); 
      ... // do work 
      return result; 
     }) 

2)做它的另一種方式:

Observable.interval(...) 
    .flatMap(n -> { 
      if (permissionGranted) { 
       ... // do work 
       return Observable.just(result); 
      } else { 
       return Observable.error(new AccessDeniedException()); 
      } 
     }) 

3)另一種方式(檢查權限只有一次):

Observable.defer(() -> { 
      if (permissionGranted) { 
       return Observable.interval(...) 
        .map(n -> { 
         ... // do work 
         return result; 
        }); 
      } else { 
       return Observable.error(new AccessDeniedException()); 
      } 
     }) 

4)還有一個(最反應):

Completable.fromCallable(() -> { 
      if (!permissionGranted) 
       throw new AccessDeniedException(); 
      return true; // returned value does not matter 
     }) 
    .andThen(Observable.interval(...) 
        .map(n -> { 
         ... // do work 
         return result; 
        }) 
     ) 

,您可以重構爲:

askForPermission().andThen(getNewObservable()) 
+0

是的,只檢查一次權限對我來說就足夠了,所以第三選項是最好的,但並不真正如此優雅,我希望...因此,在rxJava 2沒有等效就你所知? – bio007

+0

我調整了選項3並添加了選項4.我認爲選項3與您的原始意圖最接近,即「推遲」源選擇直到訂閱時間。 –