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)
。
- 包含Android扩展的Kotlin类不是建立在随后的构建上的
- Kotlin主要和次要建设者问题
- Kotlin:Sugar ORM坚持了@忽略属性
- 房间持久性:错误:实体和Pojos必须有一个可用的公共构造函数
- 做'正常'Kotlin和Kotlin为Android不同?
- notifyItemChanged后面的RecyclerView中PopupWindow的位置错误
- 带有产品风味和Kotlin的ClassNotFoundException
- Kotlin库'rxkotlin-0.21.0.jar'具有不受支持的格式。 请更新库或插件
- Firebase Perf不会运行测试应用程序:transformClassesWithFirebasePerformancePluginForDebugAndroidTest