RxJava2如何分离不同的可观察发射器的实现

这是我的情况。 我想从Android的本地LocationManager或Google服务中公开2个不同的Observable <'Location'>实现。

我想检查是否使用本地方法或gms。

所以最后我想把Observable公开给我的客户 – 他不需要知道从什么方法我收集的位置。 请注意,我使用这个库: https : //github.com/mcharmas/Android-ReactiveLocation

从谷歌服务暴露Observable。 它已经揭露了我正在寻找的Observable。 但是另一个地点经理呢。 它使用回调。

这是我的实现:

var locationEmitter : Observable<Location> = Observable.empty() init { configureEmitter() } @SuppressLint("MissingPermission") private fun configureEmitter(){ if (!isUsingLocationNativeApi) locationEmitter = reactiveLocationProvider.getUpdatedLocation(reactiveLocationRequest) else{ configureNativeLocationEmitter() } } @SuppressLint("MissingPermission") private fun configureNativeLocationEmitter() { val mLocationCallbackNativeApi: LocationListener = object : LocationListener { override fun onLocationChanged(location: Location) { locationEmitter = Observable.create<Location> { emitter -> emitter.onNext(location) } } override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {} override fun onProviderEnabled(provider: String) {} override fun onProviderDisabled(provider: String) {} } try { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (geoEventsIntervalSeconds * 1000).toLong(), geoEventsDistanceMeters.toFloat(), mLocationCallbackNativeApi, Looper.getMainLooper()) } catch (ignored: IllegalArgumentException) { ignored.printStackTrace() } try { locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (geoEventsIntervalSeconds * 1000).toLong(), geoEventsDistanceMeters.toFloat(), mLocationCallbackNativeApi, Looper.getMainLooper()) } catch (ignored: IllegalArgumentException) { ignored.printStackTrace() } } @SuppressLint("MissingPermission") override fun onLocationUpdate(): Observable<Location> { return locationEmitter } } 

但是,它不适用于LocationManager实现,

在客户端,我想能够做到这样的事情:

  rxLocationRepository.onLocationUpdate() .subscribe(Consumer { location -> //do something with location, no matter it is from LocationManager or google play services }) 

在Kotlin如何做到这一点?

UPDATE

如何摆脱主题跟踪(实际摆脱主题)和其他位置提供者? 我不想失去它们,如果客户端不想使用这个,例如在客户端调用这样的方法

  override fun stopLocationUpdates() { //get rid of the location updates } 

例如在客户端:

  rxLocationRepository.stopLocationUpdates() 

每当onLocationChanged被调用时,你正在创建一个新的observable,这是没有意义的。 只需使用PublishSubject (或BehaviorSubject可能更适合于这种情况),它可以作为Observable返回给客户端,并调用onLocationChanged中的onLocationChanged subject.onNext(location)