Попытка получить lastLocation
и как только это будет сделано, вызовите API. Но каким-то образом, как только местоположение получено, мои вызовы API всегда выполняются в mainThread
, поэтому я получаю исключение:
android.io.NetworkOnMainThreadException
Вот мой наблюдатель местоположения:
fun getLocation(): Single<Location> {
return Single.create<Location> { subscriber ->
fusedLocationClient.lastLocation.addOnSuccessListener {
if (it != null) {
subscriber.onSuccess(it)
} else {
subscriber.onError(Exception("No location"))
}
}
}
}
Код, который выполняет некоторые преобразования
val locationObserver = getLocation()
observables.add(locationObserver.flatMap { _ -> sendDataToServer(data)})
Наблюдатель
Single.zip(observables) { args1 -> args1 }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe({
Timber.i("Success")
}, {
Timber.i("Error %s", observables.size, it.localizedMessage)
it.printStackTrace()
})
Я установил subscribeOn
, поэтому он не должен быть включен mainThread
, но, похоже, что-то пропустил.
Обнаружено, что если я буду использовать что-то вроде Single.just("One").flatMap{ ... }
, это будет работать нормально и будет выполняться в неосновном потоке.
Есть ли какое-то отношение к функции getLocation
?