Пользовательский ответ / обработчик ошибок для дооснащения 2.6 - PullRequest
0 голосов
/ 24 октября 2019

У меня есть следующий класс:

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>()

Но по какой-то причине CompanionObject в ApiResponse вообще не срабатывает, есть какие-либо намеки на то, что я могу делать неправильно? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...