이 기사는 Kotlin + Retrofit + Rxjava의 간단한 포장에 대한 자세한 설명을 소개합니다. 그것은 당신과 공유됩니다. 세부 사항은 다음과 같습니다.
인스턴트 리프트
객체 retrofitutil {val connect_time_out = 30 // 연결 시간 초과 기간 x 초 val read_time_out = 30 // 데이터 시간 초과 기간 읽기 x 초 val write_time_out = 30 // 데이터 시간 초과 기간 x 초 val retrofit : log.d ( "retrofitutil", "retrofit inittrofit") by retrofit "). .BaseUrl ( "http://gank.io/api/") //이 기사는 github api를 예제로 사용합니다. adddconverterfactory (gsonconverterfactory.create ().) getokhttpclient () : okhttpclient {val builder = okhttpclient.builder () builder.connecttimeout (connect_time_out.tolong (), timeUnit.seconds) .writeTimeout (write_time_out.tolong (), timeUnit.seconds). timeUnit.seconds) if (buildConfig.debug) {builder.addinterceptor (httplogginginterceptor (). settlevel (httplogginginterceptor.level.body))} else {builder.addingrector (httplogginginterceptor (httplogging)}). 요청 헤더 builder.addinterceptor {chain-> val time = (System.currentTimeMillis () / 1000) .ToString () + "val requestBuilder = Chain.Request (). NewBuilder () requestBuilder.AddHeader ("time ", time) chain.Builder.Build (repureBuilder.Build.Build.Build.Build ()) }} 데이터 캡슐화로 돌아갑니다
클래스 응답 <t> {var error : boolean = false var results : t? = null}Gank.io의 개발 API는 데모에 사용되었습니다. 이전 일반 프로젝트의 반환 형식은 Code + Message + T였습니다.
API 인터페이스 오류/예외 통합 처리 클래스
클래스 apiexception : 예외 {var 코드 : int = 0 // 오류 코드 var msg : string? = null // 오류 메시지 생성자 (Throwable : Throwable, Code : int) : Super (Throwable) {this.code = code} 생성기 (코드 : int, msg : str : string) {this.code = code this.msg = msg}}exceptionfunction handles oneRrorResumenext 정의 :
클래스 ExceptionFunction <T> : 함수 <Throwable, Observable <T >> {재정의 재미있는 Apply (@Nonnull Throwable : Throwable) : Observable <T> {log.e ( "ExceptionFunction", Thrownable.Message) Return Observable.Error (ExceptionEngine () 1000 // 알 수없는 오류 Val analytic_server_data_error = 1001 // 페이스트 (서버) 데이터 오류 오류 val connect_error = 1002 // 네트워크 연결 오류 val time_out_error = 1003 // 네트워크 연결 fun handlexception (e : 던질 가능) : apiexception {val ex : apiexception) {// 오류가 다시 반환됩니다. httpexception) {// http err Ex = apiexception (e, e, e, e.code ()) ex.msg = "네트워크 오류 :" + ex.code return ex} else} else (e is jsonparseexception || e is jsonexception || e | Analytic_Server_Data_Error) ex.msg = "Parse Error"return ex} else} else} else} else if (e is network error) ex = apiexception (e, connect_error) ex.msg = "연결 실패"return ex} else {// network timeout exexception (e, time_error) e, ex.MSTOR). } else {// 알 수없는 오류 Ex = ApieXception (e, un_nown_error) ex.msg = e.message return ex}}} 캡슐화 요청 처리
객체 rx { / *** rxlifecycle binding lifecycle* / fun <t, e> get (Observable : Observable : Observable : Observable <response : lifecycleprovider : lifecycleprovider <e>) : 관찰 가능한 <t> {// 메모리 누출을 방지하기 위해 바인딩 라이프 사이클을 요청하고, 널 오류가 발생한 페이지가 IF를 반환합니다. rxappcompatactivity) {val rxappcompatactivity = lifecycleprovider as rxappcompatactivity observable.compose (rxappcompatactivity.binduntilevent (activityEvent.destroy))} else if (lifecycleprovider) {val rxfragment = rxfragmer as rxfragment. Observable.compose (rxfragment.binduntilevent (fragmentevent.destroy))} return observable .compose (handleresult ()) .onerrorresumenext (exceptionfunction ())} / *** / fun <t> get (Observable : Observable <Response <T >>) : {Observable <T> {Return observable (handlersult). .onerRorResumenext (exceptionFunction ())} 개인 클래스 핸들러 <T> : ObservAbleTransformer <응답 <t>, t> {Override Fun Apply : Observable : Observable <response <t >>) : ObservablesOUrce <t> {retepstream.flatmap {응답 -> createrEtult (응답)}). .unsubscribeon (schedulers.io ()) .Observeon (androidschedulers.mainthread ())} private fun <t> createresult (응답 : 응답 <t>) : Observable <T> {return Observable.create ({reppoart.error)는 {responce exception (-1, "서버 예외 및"Server ","Server " 메시지 else response.Results? .LET {Subscriber.ONNEXT (Response.Results !!)}? : Subscriber.OnComplete ()}}} httpobserver 통합 처리 반환을 정의하십시오
Abstract Class httpobserver <t> : Observer <t> { / *** 태그는 특별한 경우입니다* / private var renuctnull : boolean = true reverride on complet () {// 특별한 경우 : onnext가 성공할 때 건너 뛸 것입니다. 일회용) {// 대화 상자를 여기에 추가 할 수 있습니다.} unerror (e : strashable) {if (e is apiexception) {onerror (e.code, e.msg)} else {onerror (0, e.message)}} funn onnext (t : t) {resultnull = false onsuccess (t) onsucces (t) onsucces (t) : 로그인 실패 등과 같은 통합 처리가 실패했습니다. * @param code * @param msg */ Open fun onerror (코드 : int, msg : string?) {}} API
클래스 결과 {var _id : 문자열? = null var 생성 : 문자열? = null var desc : 문자열? = null var var var var : 문자열? = null var 소스 : 문자열? = null var 유형 : 문자열? = null var url : string = "" "var isused : boolean = false var who : string? = null var 이미지 : List <string>? = null/*** 소녀의 작은 그림*/재미있는 meizismallurl () : String {val meizi = url return meizi.replace ( "small")} 인터페이스 apiService {@get ( "data/{type}/10/10/{page}") fun getgank ( "type") Observable <response <list <resent <result >>>} object api {val apiservice : apiservice by lazy {log.d ( "api", "apiservice create lazy") retrofitutil.retrofit.create (apiservice :: class.java)}} 사용
재미있는 loaddata () {rx.get (api.apiservice.get.getgank (gettype (), mintpage), this) .subscribe (object : httpobserver <list <result>> () {fun fun fun onsuccess (t : list <result>?) {// getDatasuccess (t) ristide fun (code on oner on oneer) {super.onerror (코드, msg) // getDatafailed ()})}rxlifecycle 결합 수명주기는 가능한 메모리 누출을 처리하는 데 사용됩니다. 조각 및 활동은 해당 기본 클래스의 Rx를 상속해야합니다.
연습 프로그램
Meizikt gank.io Android 클라이언트, Kotlin + retrofit2 + rxjava 사용
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.