RxJava - дождитесь асинхронной задачи и затем вызовите Api - PullRequest
1 голос
/ 26 марта 2019

Попытка получить 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?

1 Ответ

1 голос
/ 26 марта 2019

Порядок subscribeOn, observeOn, subscribe и преобразования имеет значение.По-видимому, необходимо выполнить преобразования, в этом случае flatMap после , указав поток наблюдателя с помощью observeOn, чтобы убедиться, что код выполняется в нужном потоке.

...