Я пытаюсь создать общую архитектуру для использования сложной структуры 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>>() {
Руководство по выполнению рабочего кодекса
Это мой путеводитель по созданию кода. Он основан на принципах развития, управляемого тестированием .
ErrorCallback
класса ErrorCallback
. Заставьте это пройти. Затем напишите единичные тесты для каждого из методов, чтобы убедиться, что он ведет себя так, как вы ожидаете. PublishSubject<BaseResponse<Integer>>
для некоторого числа разных случаев: нормальные данные, последовательность нормальных данных, нормальные данные, за которыми следует ошибка, нормальные данные, за которыми следует завершение.