OkHttp и Retrofit бросают IO: Поток 3 не прогрессирует - PullRequest
2 голосов
/ 21 июня 2019

Я получаю "IO: Поток 3 не выполняется" в моем прокси-сервере Charles.

У меня есть простой вызов RxJava:

    subscription.add(api.sendSources(sendDataBody)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                callback.onFinished(it)
            }, {
                callback.onError(-1)
            }))

Простой POJO:

data class SendDataBody(
        @Json(name = "authtoken")
        var authToken: String,

) : Serializable

open class SendDataResponse(
        @Json(name = "success")
        var success: Boolean,

        @Json(name = "error")
        var error: String?
)

Вот мой интерфейс:

@Headers(
        "Content-Type: application/json; charset=UTF-8",
        "accept-encoding: gzip, deflate",
        "Accept: */*",
        "Cache-Control: no-cache"
)
@POST("sourcedata")
fun sendSources(@Body sendDataBody: SendDataBody) : Single<Any>

ЗдесьВот версии библиотеки:

// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:converter-moshi:2.3.0"
implementation "com.squareup.okhttp3:logging-interceptor:3.9.0"
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

// RxJava lib
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "io.reactivex.rxjava2:rxjava:2.2.6"
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

При проверке с Чарльзом приложение впервые всегда говорит «IO Stream 3 не выполняется», но приложение автоматически выполняет вызов снова, а во второй раз все работает нормально.Я не написал никакого кода, чтобы повторить вызов API.При попытке попробовать то же самое с помощью Postman, это работает сразуТак что это не бэк-энд.Я пытался подражать заголовкам Почтальона, и я также пытался без RxJava, без разницы.

enter image description here Второй раз работает отлично: enter image description here

При соединении с отладчиком появляется сообщение об ошибке:

result = {Response@7889} "Response{protocol=h2, code=200, message=, url=https://api.myserver.nl/sourcedata}"
 body = "�\b�������������V*.MNN-.V�JK�)N�QJ-*�"
 errorBody = null

Кажется, что ответ от сервера неправильный, но во второй раз объект правильный.

1 Ответ

0 голосов
/ 03 июля 2019

У меня была похожая проблема.Okhttp делает это молча, он пробует маршрут по умолчанию, и если он терпит неудачу, как в вашем случае, он пробует другой маршрут для каждого примера.

В моем случае была проблема с ipv6, это было сбоем, и во второй раз он пытался использовать ipv4, и это работало.

Из журналов я не могускажем, как это исправить, но я бы отладил RetryAndFollowUpInterceptor из Okhttp и выяснил более подробную информацию о том, какой маршрут завершился неудачей, а какой - успешным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...