В этой статье представлено подробное объяснение простой упаковки Kotlin + Mrowtit + Rxjava. Это совместно с вами. Детали следующие:
Экземпляр модернизации
Object rofitutul {val connect_time_out = 30 // Продолжительность времени ожидания подключения x секунд val read_time_out = 30 // Читать время ожидания данных x seconds val write_time_out = 30 // Написать время ожидания данных x seconds val intoro .baseurl ("http://gank.io/api/") // В этой статье используется github api в качестве примера. getOkHttpClient(): OkHttpClient { val builder = OkHttpClient.Builder() builder.connectTimeout(CONNECT_TIME_OUT.toLong(), TimeUnit.SECONDS) .writeTimeout(WRITE_TIME_OUT.toLong(), TimeUnit.SECONDS) .readTimeout(READ_TIME_OUT.toLong(), TimeUnit.seconds) if (buildConfig.debug) {builder.addinterceptor (httplogginginterceptor (). Setlevel (httplogginginterceptor.level.body))} else {builder.addinterceptor (httploggingInterter (). SetLelving (httploggingInterter ().). Заголовок Заголовок. }} Вернуться к инкапсуляции данных
Ответ класса <t> {var error: boolean = false var = null}Развитие API Gank.io использовалось в демонстрации. Форматом возврата предыдущего общего проекта был Code + Message + T.
Ошибка интерфейса API/Исключение Унифицированное класс обработки
класс Apiexception: Exception {var Code: int = 0 // Код ошибки var msg: string? = null // Конструктор сообщений об ошибке (Throwable: Throwable, Code: int): super (throwable) {this.code = code} constructor (code: int, msg: string) {this.code = code this.msg = msg}}}}}}}}}}}}}}}}}Определите исключение Funcuction обрабатывает OnerRorResumenext:
Класс ExceptionFunction <T>: функция <throwable, наблюдаемый <t>> {переопределить веселье применить (@nonnull throwable: throwable): vaselebable <t> {log.e ("exceptionFunction", throwable.message) return vaseleble.error (exceptionGine (). HarderException (Throwable)}}/*** *** Ошибка Val al analytic_server_data_error = 1001 // paste (server) ошибка данных val connect_error = 1002 // Ошибка сетевого соединения val time_out_error = 1003 // Сетевое подключение к сетевому подключению // http error ex = apiexception (e, e.code ()) ex.msg = "сетевая ошибка:" + ex.code return ex} else if (e is jsonparseexception || e jsonexception || e Is parseexception || e Is malformedjsonexception) {// parse data ex = apiexcept "Parse error" return ex} else if (e is is connectException) {// connect сетевая ошибка ex = apiexception (e, connect_error) ex.msg = "Неудача соединения" return ex} else if (e is is sockettimeoutexception) {// сетевая сеть ex -ext ext ext extexcept Apiexception (e, un_know_error) ex.msg = e.message return ex}}} Обработка запроса инкапсуляции
object Rx { /** * Rxlifecycle binding lifecycle*/ fun <T, E> get(observable: Observable<Response<T>>, lifecycleProvider: LifecycleProvider<E>): Observable<T> { // Request the binding lifecycle to prevent memory leakage, and return the null pointer error caused by the page being destroyed after the callback if (lifecycleProvider is RxAppCompatactivity) {val rxappCompatactivity = LifeCycleProvider AS rxAppCompAtactivity Наблюдаемое. Observable.compose (rxfragment.binduntilevent (fragmentevent.destroy))} return assable. compate (handleresult ()) .onerrorrorSumenext (exceptionFunction ())} / *** Запросы на частичный фоновый .OnerRorResumenext (exceptionFunction ())} частный класс handlerSult <t>: ussableTransformer <response <t>, t> {переопределить веселье (upstream: наблюдаемый <response <t >>): viserablesource <t> {return upstream.flatmap {response -> creatersult (response)} .subscribeon (chedule.io.io.io. .unsubscribeon (schedulers.io ()) .observeon (androidschedulers.mainthread ())}} private fun <t> createresult (ответ: ответ <t>): наблюдаемый <t> {return asbuentable.create ({andecriber -> if (response.error). и сообщение Else response.results? Определите httpobserver Unified обработку возврата
Аннотация класса httpobserver <t>: stemver <t> { / *** Tag - это особый случай* / private var resultnull: boolean = true override fun oncomplete () {// Специальный случай: onnext будет пропущен, когда запрос будет успешным, но t == nul onsubScribe (d: issosable) {// Диалог может быть добавлен здесь} переопределить веселье onerror (e: throwable) {if (e is apiexception) {onerror (e.code, e.msg)} else {onerror (0, e.message)}} Переопределение Funnext (t: t: rupturelull = false inscess. OnSuccess (t: t?) / ** * Unified обработка не удалась, например, сбой входа в систему и т. Д. * @param Code * @param msg * / open Fun Onerror (код: int, msg: string?) {}} API
Результат класса {var _id: String? = null var canectionat: string? = null var desc: строка? = null var опубликовано: строка? = NULL VAR Источник: строка? = null var type: строка? = null var url: string = "" var Isused: boolean = false var Кто: строка? = null var изображения: список <string>? = null/*** Маленькая картина Girl*/Fun meizismallurl (): string {val meizi = url return meizi.replace ("large", "small")}} apiservice {@get ("data/{type}/10/{page}") Fun getgank (@path ("type") type: string, @path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (@path (): Visemable <response <list <result >>>} api api {val apiservice: apiservice от lazy {log.d ("api", "apiservice create lazy") rofitutil.retrofit.create (apiservice :: class.java)}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} использовать
переопределить Fun LoadData () {rx.get (api.apiservice.getgank (getType (), mintpage), this) .subscribe (объект: httpobserver <list >> () {переопределить веселье onsuccess (t: result>? String?) {Super.onerror (code, msg) // getDataFailed ()}})}Жизненный цикл связывания RXLIFECYCLES используется для борьбы с возможными утечками памяти. Фрагмент и активность должны наследовать соответствующий базовый класс RX.
Практическая программа
Meizikt Gank.io Android Client, используя Kotlin + Rofit2 + rxjava
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.