android - 使用 Kotlin 协程对 Retrofit2 进行错误处理

标签 android kotlin error-handling retrofit2 kotlin-coroutines

我了解如何在不使用协程时处理错误:

@GET("user/{user}")
fun getHomeData(@Path("user") user: String?): Call<HomeDataBody>



fun getHomeData(id:String, callback: (Boolean, String?) -> Unit)
{
    val call = service.getHomeData(id)
    call.enqueue( object : Callback<HomeDataBody> {
        override fun onResponse(call: Call<HomeDataBody>, response: Response<HomeDataBody>)
        {
            if (response.isSuccessful)
            {
                dataMgr.homeData = response.body()!!.user

                callback(true, null)
            }
            else
            {
                callback(false, response.message())
            }
        }

        override fun onFailure(call: Call<HomeDataBody>, t: Throwable)
        {
            callback(false, t.message)
        }

    })
}

但是我一生都无法弄清楚如何使用协程来做到这一点,这就是我所拥有的不返回错误的协程:

@GET("user/{user}")
suspend fun getHomeDataCoroutine(@Path("user") user: String?): HomeData


suspend fun getHomeDataCoroutine(id:String) : Pair<Boolean, String>
{
    val data = service.getHomeDataCoroutine(id)

    if(data != null)
    {
        dataMgr.homeData = data
    }
    else
    {
        return Pair(false, "how do i get the error message??")
    }

}

我也尝试过这个,但是当我尝试调用 service.getHomeDataCoroutine 时,我收到此错误: java.lang.IllegalArgumentException:无法为类 java.lang.Object 创建调用适配器 对于方法 RiseServiceRetro.getHomeDataCoroutine

@GET("user/{user}")
suspend fun getHomeDataCoroutine(@Path("user") user: String?): Deferred<HomeDataBody>?

sealed class Result<out T : Any>
class Success<out T : Any>(val data: T) : Result<T>()
class Error(val exception: Throwable, val message: String =    exception.localizedMessage) : Result<Nothing>()

suspend fun getHomeDataCoroutine(id:String): Result<HomeDataBody>
{
    try {
        val response = service.getHomeDataCoroutine(id)!!.await()
        return Success(response)
    } catch (e: Exception) {
        return Error(e)
    }

}

最佳答案

为了处理调用 Retrofit 服务的 suspend 函数时的错误,请将其包装在 try-catch block 中:

@GET("user/{user}")
suspend fun getHomeDataCoroutine(@Path("user") user: String?): HomeDataBody

suspend fun getHomeDataCoroutine(id:String): Pair<Boolean, String> {
    return try {
        val data = service.getHomeDataCoroutine(id)
        dataMgr.homeData = data
        Pair(true, "")
    } catch(e: Throwable) {
        Pair(false, e.message ?: "error")
    }
}

关于android - 使用 Kotlin 协程对 Retrofit2 进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62233554/

相关文章:

vue.js - Vue.js属性或方法 “addToCart”未在实例上定义

android - 共享密码偏好

android - 如何使用 GridLayoutManager 设置每行不同的列数

android - Android我添加firebase后无法使用多个APK重建项目

angular - 为什么在另一个函数调用的函数中引发错误会破坏 Angular 应用程序

php - 无法显示PHP错误

android - 具有相对输出路径的 greenDAO 模式生成;未找到 i/o 失败

java - 为什么 ViewPager 不能在relativelayout中滑动?

arrays - 如何在 Kotlin 上实现 readLine()!!.toIntArray() ?

用于解构的 Kotlin 四元组、五元组等