У вас есть 2 разные задачи, состав и планирование.Контекст: getToken
возвращает одиночный код, а saveToken(token)
возвращает завершаемый.
состав : для создания одного и завершаемого, как вы уже заметили, вы можете использовать оператор flatMapэто возвращает новый завершаемый файл, который сначала получает токен, а затем сохраняет его (возможно, вы захотите изменить токен перед его сохранением;)
getToken().flatMapCompletable(n -> saveToken(n)) // returns a completable
Если вы хотите сохранить его как один, так что вы можете сопоставить его с первым экземпляром:
getToken().flatMap(n -> saveToken(n).toSingleDefault(n)) // returns a single
планирование : в Android вы не должны запускать запрос в главном потоке.Чтобы избежать этого, вы можете использовать оператор subscribeOn
, также похоже, что вы уже заметили, что
getToken().subscribeOn(io()).doOnNext(n -> {/*this should be evaluated in io thread*/})
getToken().subscribeOn(io()).observeOn(mainThread()).doOnNext(n -> {/*this on mainThread*/})
Если вы по-прежнему получаете сообщение об ошибке, то observeOn
или subscribeOn
был перенастроенгде-то.Нужно больше кода, чтобы быть уверенным.Но в любом случае, вы можете утверждать, что оба запроса выполняются в потоке io, применяя оператор дважды:
getToken().subscribeOn(io).flatMapCompletable(token -> saveToken(token).subscribeOn(io()))
Другой вариант, если вы используете модернизацию, это применить RxJava2CallAdapterFactory
с помощью createWithScheduler(io())
заводская, вместо стандартной.Это подтвердит, что все запросы создаются в io (), так что вы можете объединить и подготовить данные, и, наконец, применить observeOn(mainThread())
для обновления пользовательского интерфейса.