我正在编写一个可观察量来帮助我获取用户的国家/地区代码(然后传递给不同的可观察量。这是我编写的:
val tm: TelephonyManager = requireContext().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
var countryCodeValue: String = tm.networkCountryIso.toUpperCase(Locale.ROOT)
disposables.add(Observable.just(countryCodeValue)
.flatMap {
if(it.isEmpty()) {
rxLocation.location()
.lastLocation()
.flatMap {
rxLocation.geocoding().fromLocation(it).map { item -> item.countryCode }
}
} else {
Observable.just(it)
}
}
.subscribe ({
Timber.i("Got country code: %s", it)
}, { error -> Timber.i("Got error $error")}))
我在这里做什么?从Context.TELEPHONY_SERVICE中获取国家/地区代码。如果返回空字符串,则调用 RxLocation 运算符以获取基于用户位置的地理编码国家/地区代码值。
it.isEmpty((块完全失败,并给出一个错误,指出"类型不匹配"。这是令人惊讶的,因为flatMap应该按预期发出一个字符串,但它没有。如何解决这个问题?
在阅读了Mark Keen的评论后解决了这个问题,我应该使用flapMapMaybe。
工作代码现在是:
disposables.add(Observable.just(countryCodeValue)
.flatMapMaybe {
if(it.isEmpty()) {
rxLocation.location()
.lastLocation()
.flatMap {
rxLocation.geocoding().fromLocation(it).map { item -> item.countryCode }
}
} else {
Maybe.just(it)
}
}
.subscribe ({
Timber.i("Got %s", it)
}, { error -> Timber.i("Got error $error")}))