2017-06-29 28 views
0

我見過很多關於如何將有限事物(如數組或Iterable s)轉換爲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以獲得更多細節。

雖然關於你實現一些評論:
- 沒有點設置這兩個CancellableDisposable,爲後來的人會撤消/配置第一位的,你可以看到他們here之間的區別。
- 我認爲最好的做法是,在開始收聽更新前註冊可取消/棄用,以防止奇怪的邊緣情況。