2017-06-29 54 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之间的区别。
- 我认为最好的做法是,在开始收听更新前注册可取消/弃用,以防止奇怪的边缘情况。