kotlin 如何处理Retrofit中的Deferred await错误

oalqel3c  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(143)

我们的应用程序有许多网络请求,我们使用Coroutines与Retrofit如下所示:

suspend fun fetchAccountInfo() {
    val api = retrofit.create(MainActivityApi::class.java)
    val versionResponse = api.getVersionAsync().await()
    ...
}

字符串
问题是,当设备没有连接到internert时,Retrofit将引发一个exeption,应用程序将崩溃。我发现this link说,把await()放入一个try/catch中,如下所示:

suspend fun fetchAccountInfo() {
    val api = retrofit.create(MainActivityApi::class.java)
    try {
        val versionResponse = api.getVersionAsync().await()
    } catch(e: Exception) {
      //
    }
    ...
}


但是我们的应用程序有很多网络请求,这个解决方案不适合我们。如何在不将所有await()调用放入try/catch的情况下防止应用崩溃?

s8vozzvw

s8vozzvw1#

即使 Package 是首选的方法,我相信还有另一种方法(我个人不会使用它,但可能适合你)
您可以创建一个OkHttp拦截器,它将对每个请求执行try-catching,并返回由reflect的静态Response.error(someParams)创建的响应。
你可以参考https://github.com/gildor/kotlin-coroutines-retrofit/issues/34来构造,基本上只需要修改catch{}块。
希望这对你有帮助,GL!

wh6knrhe

wh6knrhe2#

正如另一条评论所提到的,您可以创建一个自定义拦截器来处理异常并返回一个指示错误的自定义响应。

class TeapotInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()

        val response: Response = try {
            chain.proceed(request)
        } catch (e: Exception) {
            // Log here
            Response.Builder()
                .request(request)
                .protocol(Protocol.HTTP_2)
                .code(418)
                .message("I'm a teapot")
                .build()
        }

        return response
    }
}

val teapotInterceptor = TeapotInterceptor()
OkHttpClient.Builder()
    .addInterceptor(teapotInterceptor)
    .build()

字符串

相关问题