Как создать обработчик Generic Response для ошибки и проверки ответа с помощью модифицированных, rxjava и кинжалов

Я пытаюсь создать общую архитектуру для использования сложной структуры json следующим образом:

Формат Json

{ "type": "success", "code": "s-groups-0006", "description": "Index List successfully", "result": { "asOnDate": 1505457095278, "indexList": [ { "change": "22.35", "changePercent": "0.27", "isDefault": true, "isEditable": false } ] } 

}

Формат кинжала

 @Singleton fun provideGson(): Gson = GsonBuilder() .setLenient() // .registerTypeAdapter(BaseResponse::class.java, RestDeserializer<BaseResponse<T>>()) .create() 

Оставшиеся места для отдыха

  class RestDeserializer<T> : JsonDeserializer<T> { @Throws(JsonParseException::class) override fun deserialize(je: JsonElement, type: Type, jdc: JsonDeserializationContext): T? { val content = je.asJsonObject // Deserialize it. You use a new instance of Gson to avoid infinite recursion // to this deserializer return Gson().fromJson<T>(content, type) } 

}

Ошибка обратного вызова

 abstract class ErrorCallBack<T : BaseResponse<T>> : DisposableObserver<T>() { protected abstract fun onSuccess(t: T) override fun onNext(t: T) { //You can return StatusCodes of different cases from your API and handle it here. I usually include these cases on BaseResponse and iherit it from every Response onSuccess(t) } override fun onError(e: Throwable) { when (e) { is HttpException -> { val responseBody = (e).response().errorBody() responseBody?.let { Le("Error in call htttp exception") } } is SocketTimeoutException -> { // todo Le("Error in Socket time out") } is IOException -> { // todo Le("Error in IO Exception") } else -> { e.message?.let { // todo } } } } override fun onComplete() { } private fun getErrorMessage(responseBody: ResponseBody): String { return try { val jsonObject = JSONObject(responseBody.string()) jsonObject.getString("message") } catch (e: Exception) { e.message!! } } 

}

вместилище

  override fun getValidateUser(validateUser: ValidateUser): LiveData<ValidateUserResponse> { val mutableLiveData = MutableLiveData<ValidateUserResponse>() remoteServices.requestValidateUser(validateUser) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : ErrorCallBack<BaseResponse<ValidateUserResponse>>() { override fun onSuccess(t: BaseResponse<ValidateUserResponse>) { if (t.type == CommonContents.SUCCESS) { Ld("Success in validate user") mutableLiveData.value = transform(t) } else { Le("Validate User Error") } } }) return mutableLiveData } 

Класс данных

 data class BaseResponse<out T>( @SerializedName(CommonContents.TYPE) val type: String, @SerializedName(CommonContents.CODE) val Code: String, @SerializedName(CommonContents.DESCRIPTION) val Description: String, @SerializedName(CommonContents.RESULT)val result: T? = null) 

Это мои структуры, и я пытаюсь создать общую структуру, но сталкиваюсь с проблемой при вызове обратного вызова Error.

Пожалуйста, помогите мне, как это достичь. Могу ли я назвать общий метод внутри общего ответа?

  .subscribeWith(object : ErrorCallBack<BaseResponse<ValidateUserResponse>>() { 

Руководство по выполнению рабочего кодекса

Это мой путеводитель по созданию кода. Он основан на принципах развития, управляемого тестированием .

  1. Настройте среду тестирования вашего устройства в среде IDE. Лично я использовал JUnit 4 с Eclipse, но вы можете предпочесть JUnit 5 с IDE JetBrains.
  2. Напишите модульный тест для вашего ErrorCallback класса ErrorCallback . Заставьте это пройти. Затем напишите единичные тесты для каждого из методов, чтобы убедиться, что он ведет себя так, как вы ожидаете.
  3. Напишите единичные тесты, в которых ваш тестовый прибор является PublishSubject<BaseResponse<Integer>> для некоторого числа разных случаев: нормальные данные, последовательность нормальных данных, нормальные данные, за которыми следует ошибка, нормальные данные, за которыми следует завершение.
  4. Оттуда добавьте еще несколько тестов, чтобы вы могли проверить всю наблюдаемую цепочку.
Intereting Posts
Неразрешенная ссылка: T Android Kotlin ImageView binding Возвращение котлинских кодов Java в Android Studio Canary 5 Расширения Android Kotlin, пакеты не могут быть импортированы Могу ли я применять функцию infix внутри собственного класса без этого? не может разрешить ссылку на методы Запечатанные обобщенные обобщенные классы в котлине, не связанные с внутренними классами Пользовательские предложения в меню SearchView в меню Удалите все неиспользуемые ресурсы из проекта Android Как использовать выражение Lamba, чтобы сделать вызовы метода Java менее подробными в Kotlin? Нулевая проверка, если условия Как вставлять для циклов в шаблоны строк Kotlin OkHttp CookieJar не может добавить cookie для запроса Как сделать выражение регулярного выражения с первой вероятностью. (Котлин) Kotlin + Intelij + HtmlUnit: Ни одна из следующих функций не может быть вызвана с предоставленными аргументами