2017-06-29 145 views
0

我有一个简单的例子,我正在尝试使用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) 
      } 
} 
+0

我看不到任何错误。你可以显示'getLastKnowLocation()'代码吗? – GVillani82

+0

更新了我的帖子@ GVillani82 – oferiko

+0

然后很难说,但图书馆有问题,或者至少有特殊的使用要求。为了检查你的代码是否有效,你可以简单地尝试用'return Maybe.just(new LocationData(10,20))替换'Maybe';'你会看到它会起作用。 – GVillani82

回答

0

不幸的是,谁把我安置在正确的路径用户删除他的回答:(

这是我结束了

addDisposeable(
      RxView.clicks(save_btn).share() 
        .observeOn(Schedulers.computation()) 
        .withLatestFrom(locationProvider.getLastKnowLocation().toObservable(), BiFunction { _:Any, l:LocationData -> l }) 
        .map { 
         val place = Place(UUID.randomUUID().toString(), "test-address", it.latLng) 
         db.placeDao().insertAll(place) 
        } 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe({ 
         Timber.d("place-saved") 
        }, { throwable -> Timber.e(throwable) })) 

我无法找到的“双功能”的一部分一个更好的方式,如果任何人有东西,而不是更好。 另外请注意,你需要安装前后调用veOn两次用于线程切换部分。

+0

啊!对不起,我没有删除它。 –

+0

不知道什么是被删除的答案,但无论如何我不确定'withLatestFrom'会做你想做的事,它只会向位置提供者订阅一次,并且会为每次点击重播相同的位置 - 比如combineLatest(由于'getLastKnowLocation()'按照定义只发出单个项目 - 它是一个Maybe),所以每个用户点击这种方式都不会获得更新位置。 – yosriz

+0

我看到你的有效点@yosriz,有什么想法如何去做呢? – oferiko

相关问题