2017-04-10 17 views
1

に同じ加入者登録:)このような何かすることはできなかったrxJavaの1.xではrxJava 2

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

GetNewObservableを(私は同じアプローチを見つけることができないもObservable<Foo>

を返しますrxJava 2. ObservableオブジェクトにEmitterまたはObservableEmitterを受け入れるsubscribeメソッドはありません。

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

しかし

rxJava 1に感謝のようないくつかのより簡単な方法がある場合、私は思ったんだけど:私はこのような何かを行うことができたとします。

+0

あなたはこの非自明なアプローチを実現するために、正確に何をしようとしていますか?それを行うためのよりクリーンな方法がなければならない。あなたのコードの目的を記述してください。 –

+0

確かに、これを回避するにはさらに多くの方法がありますが、実際にはrxJava 2に相当するものがないかどうか不思議です。このアプローチは実際に[Reactive Programming with RxJava](http://shop.oreilly.com /product/0636920042228.do)book。 しかし、私の場合には私はアンドロイドライブラリをやっていて、観察可能な魔女にx分ごとに何らかの行動を起こさせたいと思っています。だから、私はこれを観察できるタイマーを持っている。しかし、「仕事」にはいくつかの許可が必要です。私はちょうどそれが確認可能なタイマーを購読するよりもokの場合にのみ、最初にアクセス許可をチェックしたいと思っていました。それ以外の場合はonErrorを返します。 – bio007

+0

これについてはどうすればよいですか:if(permissionGranted)return Observable.interval(...)。map(...);それ以外の場合はObservable.error(...); '? –

答えて

0

1)あなたはコメントで説明したものを実行する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

はい、アクセス許可を1回だけ調べれば十分ですので、3番目のオプションは最高ですが、実際にはそれほどエレガントではありません... rxJava 2には同等のものはありませんあなたが知っている限り? – bio007

+0

私はオプション3を調整し、オプション4を追加しました。オプション3は、元の意図に最も近いもの、つまり、サブスクリプション時間までのソースの選択を「延期」すると思います。 –

関連する問題