OkHttp Dispatcher IllegalStateException при попытке сделать второй сетевой вызов - PullRequest
0 голосов
/ 26 февраля 2020

Я столкнулся с этой проблемой, когда пытался перенести сетевые вызовы из «com.jakewharton.retrofit: retrofit2- kotlin -coroutines-adapter» во встроенную функцию приостановки модифицированной версии 2.6.

Сценарий, я выполнение нескольких последовательных сетевых вызовов для извлечения данных из API. Мой первый вызов прошел без проблем, но для второго дооснащения. Это дает мне следующую ошибку.

Изменения, которые я сделал в своем коде,

  1. Удалил библиотеку адаптера из app.gradle и обновил мое обновление до 2.7.
  2. Удалена строка выполнения вызова await () и добавлена ​​функция "suspend" в методе интерфейса модификации.
  3. Удален метод интерфейса отложенной переменной модификации.

Моя консоль Logcat

2020-02-26 17:08:19.777 E: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.chilindo, PID: 22114
    java.lang.IllegalStateException: cannot make a new request because the previous response is still open: please call response.close()
        at okhttp3.internal.connection.Transmitter.newExchange$okhttp(Transmitter.kt:157)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at com.chilindo.base.network.ChilindoAPIL$Companion$invoke$$inlined$-addInterceptor$1.intercept(Interceptor.kt:144)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.kt:219)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:194)
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

После модернизации 2,6

override suspend fun fetchUserProfile() {
        try {
            val result = chilindoAPI.fetchProfile()
            if (result.isSuccessful) {
                _userProfileTable.postValue(result.body())
            }
        } catch (e: HttpExceptionExtended) {
            e.printStackTrace()
        } catch (e: NoConnectivityException) {
            e.printStackTrace()
        }
    }

    override suspend fun fetchCategoriesResponse(domain: String, language: String) {
        try {
            val categoriesRequest = CategoriesRequest()
            categoriesRequest.countryName = domain
            categoriesRequest.language = language
            val result = chilindoAPI.fetchCategories(categoriesRequest)
            if (result.isSuccessful) {
                _categoriesResponse.postValue(result.body())
            }
        } catch (e: HttpExceptionExtended) {
            e.printStackTrace()
            _categoriesResponse.postValue(null)
        } catch (e: NoConnectivityException) {
            e.printStackTrace()
        }
    }

и API-интерфейс

    @POST(ServiceTypes.USER_PROFILE)
    suspend fun fetchProfile(): Response<UserProfileTable>

    @POST(ServiceTypes.CATEGORIES)
    suspend fun fetchCategories(@Body categoriesRequest: CategoriesRequest): Response<List<CategoriesResponse>>

1 Ответ

0 голосов
/ 26 февраля 2020

Ошибка в том, что ваш перехватчик (com.chilindo.base.network.ChilindoAPIL) не закрывает ответ перед отправкой любого запроса. Это была тихая утечка на старых версиях OkHttp; сегодня это обнаружено, чтобы вы могли избежать утечки.

...