2017-04-10 1 views
1

In rxJava 1.x war es möglich, so etwas zu tun:in rxJava auf dem gleichen Teilnehmer abonnieren 2

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

GetNewObservable() Rückkehr auch Observable<Foo>

ich nicht den gleichen Ansatz finden in rxJava 2. Es gibt keine Subscribe-Methode, die Emitter oder ObservableEmitter auf Observable-Objekt akzeptiert. Ich glaube, ich etwas tun kann:

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

Aber ich frage mich, ob es eine einfachere Art und Weise wie in rxJava ist 1.

Dank.

+0

Was genau sind Sie mit diesem nicht offensichtlichen Ansatz zu erreichen versuchen? Es muss viel sauberer sein, dies zu tun. Bitte beschreiben Sie den Zweck Ihres Codes. –

+0

Sicher, es gibt wahrscheinlich mehr Möglichkeiten, dies zu umgehen, aber ich bin gespannt, ob es wirklich keine Entsprechung in rxJava 2 gibt. Dieser Ansatz wird in [Reaktive Programmierung mit RxJava] (http://shop.oreilly.com) erwähnt /product/0636920042228.do) buchen. Aber zurück zu meinem Fall, ich mache Android lib und ich möchte beobachtbare Hexe haben wird alle x Minuten einige Aktion zu tun. Also habe ich einen Timer dafür beobachtbar. Aber die "Arbeit" erfordert einige Berechtigungen gewährt werden. Ich wollte nur zuerst die Berechtigungen überprüfen und nur dann, wenn es in Ordnung ist, den Timer beobachtbar zu abonnieren. Sonst return onError ... – bio007

+0

Was ist damit: 'if (permissionGranted) return Observable.interval (...). Map (...); Sonst return Observable.error (...); '? –

Antwort

0

1) Eine Möglichkeit, zu tun, was Sie in den Kommentaren beschrieben:

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

2) Ein anderer Weg, es zu tun:

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

3) Noch eine andere Art und Weise (überprüfen Erlaubnis nur einmal):

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

4) Eine weitere (die reaktive):

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

, die Sie als Refactoring können:

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

Ja, die Erlaubnis nur einmal zu überprüfen ist für mich ausreichend. 3. Option ist die beste, aber nicht wirklich so elegant, auf die ich gehofft hatte ... Also gibt es kein Äquivalent in rxJava 2 as Soweit Sie wissen? – bio007

+0

Ich habe Option 3 angepasst und Option 4 hinzugefügt. Ich denke, dass Option 3 Ihrer ursprünglichen Absicht am nächsten kommt, d. H. "Quellenauswahl" bis zur Abonnementzeit verschieben. –

Verwandte Themen