用于改造2.6的自定义响应/错误处理程序

时间:2019-10-24 09:06:40

标签: android kotlin retrofit2

我有以下课程:

interface API
{
    @GET("/data.json")
    suspend fun fetchData() : MyResponse

    companion object
    {
        private val BASE_URL = "http://10.0.2.2:8080/"

        fun create(): MyAPI
        {
            val gson = GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .create()

            val retrofit = Retrofit.Builder()
                .addConverterFactory( GsonConverterFactory.create( gson ) )
                .baseUrl( BASE_URL )
                .build()

            return retrofit.create( MyAPI::class.java )
        }
    }
}

我用以下方式称呼它:

val data = StadiumAPI.create().fetchData()
Log.d( "gotdata", data.toString() )

一切正常,但是现在我想处理错误,我正在尝试实现以下目标:

    Var response = StadiumAPI.create().fetchData()

    when( response.state )
    {
        Success       -> doSomethingWithTheData( response.data )
        Error         -> showError( response.error )
        Processing    -> showSpinner()
    }

主要问题是,我不仅需要处理成功/错误(基于HTTP状态代码以及GSON转换是否成功),还需要处理异常(例如网络问题)并将其作为Error传递给响应状态,以及通过GSON保持自动转换,而无需手动进行处理。

我完全不知道该从哪里去。据我了解,我需要在改造响应API中创建一个自定义数据类型,该数据类型将“接受”响应,然后可以操纵其属性以生成上面的代码结构。您能指出正确的方向,我应该从这里到哪里去?谢谢!

-----------编辑----------------------------------- --------

我发现我可以按照以下方式做我想做的事情:

interface API
{
    @GET("/data.json")
    suspend fun fetchData() : ApiResponse<MyResponse>
    ....
}

这是 ApiResponse

sealed class ApiResponse<T> {
    companion object {
        fun <T> create(response: Response<T>): ApiResponse<T> {
            Log.d( "networkdebug", "success: " + response.body().toString() )
            return if(response.isSuccessful) {
                Log.d( "networkdebug", "success: " + response.body().toString() )
                val body = response.body()
                // Empty body
                if (body == null || response.code() == 204) {
                    ApiSuccessEmptyResponse()
                } else {
                    ApiSuccessResponse(body)
                }
            } else {
                val msg = response.errorBody()?.string()
                Log.d( "networkdebug", "error: " + msg.toString() )
                val errorMessage = if(msg.isNullOrEmpty()) {
                    response.message()
                } else {
                    msg
                }
                ApiErrorResponse(errorMessage ?: "Unknown error")
            }
        }
    }
}

class ApiSuccessResponse<T>(val data: T): ApiResponse<T>()
class ApiSuccessEmptyResponse<T>: ApiResponse<T>()
class ApiErrorResponse<T>(val errorMessage: String): ApiResponse<T>()

但是无论出于什么原因,ApiResponse中的CompanionObject根本不会触发,关于我可能做错了什么的任何提示?谢谢!

0 个答案:

没有答案