我有以下课程:
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根本不会触发,关于我可能做错了什么的任何提示?谢谢!