Android сопрограммы обрабатывают исключение - PullRequest
0 голосов
/ 31 мая 2019

В моем приложении.Я пытаюсь отправить сетевой запрос, используя Kotlin Coroutines .Я проанализировал ответ и сгенерировал исключение для некоторой ситуации. Вот код:

class ProxyErrorInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request)
        val bodyString = response.body()?.string()
        when (response.code()) {
            HttpURLConnection.HTTP_OK -> {
                val error = Gson().fromJson(bodyString, BusinessModel::class.java)
                if (error.errorCode != null) {
                    throw BusinessDataException(error.errorCode, error.errorMessage)
                }
            }
            HttpURLConnection.HTTP_INTERNAL_ERROR -> {
                val error = Gson().fromJson(bodyString, BusinessModel::class.java)
                if (error.errorCode != null) {
                    throw BusinessDataException(error.errorCode, error.errorMessage)
                }
            }
        }
        return response.newBuilder()
                .body(ResponseBody.create(response.body()?.contentType(), bodyString)).build()
    }
}

Это исключение перехвата.

fun getAccounts() {
    try {
        val myJob = GlobalScope.launch(Dispatchers.IO) {
            val response = interactor.getAccounts()
            launch(Dispatchers.Default) {
                data.postValue(mapper.mapAccountList(response))
            }
        }
    } catch (e: Exception) {
        Log.d("Проверка", e.message)
    }
}

Однако это не сработало, и, наконец, мое приложение упало.

ОБНОВЛЕНИЕ

Я пытался использовать CoroutineExceptionHandler, но это не помогло

fun getAccounts() {
    val myJob = GlobalScope.launch(handler) {
        val response = interactor.getAccounts()
        launch(Dispatchers.Default) {
            loadingStatus.progress.set(false)
            data.postValue(mapper.mapAccountList(response))
        }
    }
}

private val handler = CoroutineExceptionHandler { _, exception ->
    error.postValue(Any())
    loadingStatus.progress.set(false)
    when (exception) {
        is BusinessDataException -> {
            Log.d("Check", exception.message)
        }
        else -> {
            loadingStatus.hasError.set(true)
            loadingStatus.textError.set(exception.message)
        }
    }
}

ОБНОВЛЕНИЕ 2

Это сообщение об исключении в logcat

06-03 17: 18: 01.012 23796-24010 / ru.mtsbank.dbosme E / AndroidRuntime: FATAL EXCEPTION: OkHttp Процесс диспетчера: ru.mtsbank.dbosme, PID:23796 java.lang.Error: ru.mtsbank.dbosme.exceptions.BusinessDataException: Нарушен контракт взаимодействия и дальнейшее описание, что не так ... в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1119) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) в java.lang.Thread.run (Thread.java:818) Причина: ru.mtsbank.dbosme.exceptions.BusinessDataException:Нарушен контракт взаимодействия, и далее описание, что не так ... на ru.mtsbank.dbosme.data.web.interceptors.ProxyErrorInterceptor.intercept (ProxyErrorInterceptor.kt: 27) на okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorCha).Java: 147) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в ru.mtsbank.dbosme.data.web.interceptors.MainInterceptor.intercept (MainInterceptor.kt: 18) в ohttpin..RealInterceptorChain.proceed (RealInterceptorChain.java:147) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в okhttp3.logging.RealInterceptorChain.proceed (RealInterceptorChain.java:147) на okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) на okhttp3.RealCall.getResponseWithInterceptorCalAsyncCall.execute (RealCall.java:147) в okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113Thread.jol).$ Worker.run (ThreadPoolExecutor.java:588) на java.lang.Thread.run (Thread.java:818)

1 Ответ

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

Я считаю, loadingStatus.progress.set(false) это проблема. Это не выполняется в главном потоке, который может вызвать исключение. Всякий раз, когда вы обновляете пользовательский интерфейс, используйте Dispatchers.MAIN вместо Dispatchers.Default

...