我有一个简单的例子,我正在尝试使用rxJava 2,但我卡住了。RxJava 2也许用Observable
我有一个locationProvider,它返回一个Maybe(与LatLng一些模型)。每次用户点击按钮时,我都想获取他当前的位置并将位置保存到数据库。
只是要清楚, RxView.clicks(save_btn)应该在MainThread上,位置和db保存应该在异步线程上,并且响应应该返回到mainThread。
我该怎么做?
addDisposeable(RxView.clicks(save_btn)
.flatMap { locationProvider.getLastKnowLocation().toObservable() }
.map {
val place = Place(UUID.randomUUID().toString(), "test-address", it.latLng)
db.placeDao().insertAll(place)
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Toast.makeText([email protected], "saved", Toast.LENGTH_SHORT).show()
}, { throwable -> Timber.e(throwable) }))
我也试图把它简化为这样:
RxView.clicks(save_btn).share()
.flatMap { locationProvider.getLastKnowLocation().toObservable() }
.subscribe({
val place = Place(UUID.randomUUID().toString(), "test-address", it.latLng)
db.placeDao().insertAll(place)
Timber.d("place-saved")
}, { throwable -> Timber.e(throwable) }))
但这个代码只执行第一个点击之后不会继续。 是否由于Maybe.toObservable()?应该如何解决? 感谢您的帮助。
这是locationProvider的代码,我使用RxLocation:
fun getLastKnowLocation(): Maybe<LocationData> {
return rxLocation.location()
.lastLocation()
.map {
val address = geocoder.getFromLocation(it.latitude, it.longitude, 1).first()
val latlng = LatLng(it.latitude, it.longitude)
LocationData(latlng, address)
}
}
我看不到任何错误。你可以显示'getLastKnowLocation()'代码吗? – GVillani82
更新了我的帖子@ GVillani82 – oferiko
然后很难说,但图书馆有问题,或者至少有特殊的使用要求。为了检查你的代码是否有效,你可以简单地尝试用'return Maybe.just(new LocationData(10,20))替换'Maybe';'你会看到它会起作用。 – GVillani82