2017-06-29 8 views
0

配列やIterableなどの有限のものをObservableに変換する方法の例がたくさんありましたが、実際に効果的なものからObservableを作成する方法を理解しているかどうかはわかりませんイベント受信者のように無制限です。私はRxJava2のドキュメントを勉強し、AndroidのLocationListenerを例にしてこれを考え出しました。Observablesでイベントリスナーをラップする

これを行うには、より簡単で正しい方法がありますか?私は "RxBus"のコンセプトを認識していますが、これは古いイベントバスのパラダイムに執着する方法のようです。

final Observable<Location> locationObservable = Observable.create(new ObservableOnSubscribe<Location>() { 
    final LocationManager mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    @Override 
    public void subscribe(final ObservableEmitter<Location> emitter) throws Exception { 
     final LocationListener listener = new LocationListener() { 
      @Override 
      public void onLocationChanged(final Location location) { 
       emitter.onNext(location); 
      } 

      @Override 
      public void onStatusChanged(final String s, final int i, final Bundle bundle) { 
       // TODO ??? 
      } 

      @Override 
      public void onProviderEnabled(final String s) { 
       // TODO ??? 
      } 

      @Override 
      public void onProviderDisabled(final String s) { 
       // TODO ??? 
      } 
     }; 

     mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); 

     emitter.setCancellable(new Cancellable() { 
      @Override 
      public void cancel() throws Exception { 
       mLocationManager.removeUpdates(listener); 
      } 
     }); 

     emitter.setDisposable(new Disposable() { 
      private AtomicBoolean mDisposed; 

      @Override 
      public void dispose() { 
       if(mDisposed.compareAndSet(false, true)) { 
        mLocationManager.removeUpdates(listener); 
       } 
      } 

      @Override 
      public boolean isDisposed() { 
       return mDisposed.get(); 
      } 
     }); 
    } 
}); 

答えて

1

Observable.create()を使用することは確かに正しい方法です。

しかし、RxJava2では、Observableを拡張するのがデフォルトの方法です。この詳細は、answerを参照してください。

実装に関するいくつかのコメントかかわら:
- 後で1は、あなたがそれらhereの違いを見ることができ、最初のものを処分/キャンセルうとして何のポイントは、CancellableDisposableの両方を設定することはありません。
- 奇妙なエッジケースのレースを防止するために、更新を聞き始める前にキャンセル/ディスポーザブルを登録することをおすすめします。

関連する問題