Artikel ini memperkenalkan penjelasan terperinci tentang kemasan sederhana Kotlin + Retrofit + RxJava. Itu dibagikan dengan Anda. Dengan rincian sebagai berikut:
Instantiate Retrofit
Objek retrofitutil {val connect_time_out = 30 // durasi batas waktu koneksi x detik val read_time_out = 30 // Baca data batas waktu data x detik val write_time_out = 30 // Tulis Data Timeout Durasi x Detik Retrofit Val: Retrofit oleh Lazy {log.d ("retrofitutil", "retrofit inisi ulang. .baseUrl ("http://gank.io/api/") // Artikel ini menggunakan GitHub API sebagai contoh.addConverterfactory (getjava2callAdapterfactory. getokhttpclient (): okhttpclient {val builder = okhttpclient.builder () builder.connecttimeout (connect_time_out.tolong (), timeunit.seconds) .writetimeout (write_time_out.tolong (), time.seconds) .writetimeout (write_time_out.tolong (), time.seconds) .sritetimeout (write_time_out.tolong (), time.seconds) .seCeTeUTMET (write. Timeunit.seconds) if (buildconfig.debug) {builder.addInterceptor (httploggingInterceptor (). Setlevel (httploggingintercepor.level.body) {builder.addinterceptor (httploggingInderCepor (). {Builder.addInterceptor (httploggingInderCepor (). Permintaan header builder.addinterceptor {rantai -> val time = (System.currentTimeMillis () / 1000) .tostring () + "" val requestBuilder = rantai. }} Kembali ke enkapsulasi data
Respons kelas <T> {var error: boolean = false var hasil: t? = null}API pengembangan gank.io digunakan dalam demo. Format pengembalian dari proyek umum sebelumnya adalah Format Kode + Pesan + T.
Kesalahan Antarmuka API/Pengecualian Kelas Penanganan Terpadu
Class ApiException: Exception {var Code: int = 0 // kode kesalahan var msg: string? = null // Konstruktor pesan kesalahan (Throwable: Throwable, Code: int): super (throwable) {this.code = code} konstruktor (kode: int, msg: string) {this.code = kode this.msg = msg}}Define Exceptifunction menangani onerrorresumeNext:
class exceptifunction <t>: function <throwable, observable <t>> {override fun apply (@nonnull throwable: throwable): Observable <t> {log.e ("exceptifunction", throwable.message) return dapat diamati. 1000//Unknown error val ANALYTIC_SERVER_DATA_ERROR = 1001//Paste (server) data error val CONNECT_ERROR = 1002//Network connection error val TIME_OUT_ERROR = 1003//Network connection timeout fun handleException(e: Throwable): ApiException { val ex: ApiException if (e is ApiException) { //Error returned by the server return e } else if (e is HttpException) { //HTTP error ex = ApiException(e, e.code()) ex.msg = "Network error:" + ex.code return ex } else if (e is JsonParseException || e is JSONException || e is ParseException || e is MalformedJsonException) { //Parse data error ex = ApiException(e, ANALYTIC_SERVER_DATA_ERROR) ex.msg = "Parse error" return ex } else if (e is ConnectException) {//Connect network error ex = ApiException(e, CONNECT_ERROR) ex.msg = "Connection failed" return ex } else if (e is SocketTimeoutException) {//Network timeout ex = ApiException(e, TIME_OUT_ERROR) ex.msg = "Network timeout "return ex} else {// kesalahan tidak diketahui ex = apiException (e, un_nown_error) ex.msg = e.message return ex}}} Pemrosesan permintaan enkapsulasi
objek rx { / *** rxlifecycle mengikat siklus hidup* / fun <t, e> get (dapat diamati: dapat diamati <response <t>>, lifecycleProvider: lifecycleProvider <E>): pooring yang dapat diobservasi jika pointer level yang disebabkan oleh pooring yang disebabkan oleh pooring low ronture untuk mencegah pemesanan memori, dan mengembalikan lifeCOLE PAGING LAGah. adalah rxappcompatactivity) {val rxappcompatactivity = lifeCycleProvider sebagai rxappcompatactivity observable (rxappcompatactivity.binduntilevent (activityEvent.destroy)} lain jika lifeCycleProvider adalah rxfragment) {vale rxfragment = lifecycleProvider adalah rxfragment) {vale rxfragment = lifeCycleProvider adalah rxFragment) {vale rxfragment = lifeCycleProvider adalah rxFragment) {val Observable. .onerrorresumenext (exceptifunction ())} class private handleresult <t>: observableTransformer <sponse <t>, t> {override fun apply (hulu: observable <response <t>): ObservableSource <T> {return hupstream.flatMap {response -> creatreesult (response) {return. .unsubscribeon (schedulers.io ()) .observeon (androidschedulers.mainthread ())}} kesenangan pribadi <t> createresult (respons: respons <t>): Observable <t> {return dapat diamati.create ({pelanggan -> if (response.ror) lemparan {returnable.create (-1) kode dan pesan lagi response.Results? .let {pelanggan Tentukan pengembalian pemrosesan httpobserver terpadu
Kelas Abstrak HttpoBserver <T>: Observer <T> { / *** Tag adalah kasus khusus* / private var resultnull: boolean = true override fun oncomplete () {// kasus khusus: onNext akan dilewati (overcrided overcride (tetapi t == null, dan masih perlu diproses dengan sukses jika hasilnya) On -nulls) Disposable) {// Dialog dapat ditambahkan di sini} override fun OnError (e: Throwable) {if (e is apiException) {onError (e.code, e.msg)} else {onError (0, e.message)} override fun onnext (t: t) {resultNull = founde onSe OnSa) * Pemrosesan terpadu gagal, seperti kegagalan login, dll. * Kode @param * @param msg */ buka fun onError (kode: int, msg: string?) {}} API
Hasil kelas {var _id: string? = null var createdat: string? = null var desc: string? = null var dipublikasikan: string? = null var Source: String? = null var type: string? = null var url: string = "" var isused: boolean = false var siapa: string? = null var gambar: Daftar <string>? = null/*** gambar kecil gadis*/fun meizismAllUrl (): string {val meizi = url return meizi.replace ("besar", "kecil")}} antarmuka apiservice {@get ("data/{type}/10/{page}") fungank (@path @path ("page (" page: "page:" Diobservasi <respons <Daftar <RAEST>>>} objek API {val apiservice: apiservice by lazy {log.d ("API", "APIService create lazy") retrofitutil.retrofit.create (apiservice :: class.java)}} menggunakan
override fun loadData () {rx.get (api.apiservice.getGank (getType (), mintpage), this) .subscribe (objek: httpoBserver <list <rance> () {override oversucs (t: list <hasil>?) {// getDataC: funscess (t) list <ance>?) {// getDataC: funscess (t) list <ance>?) {// getDatac overRide (teRRIDES (t: list <ance> {super.onerror (kode, msg) // getDataFailed ()}})}Siklus hidup pengikat siklus rxlifecycle digunakan untuk menangani kemungkinan kebocoran memori. Fragmen dan aktivitas perlu mewarisi kelas dasar yang sesuai dari Rx.
Program Praktek
Klien meizikt gank.io android, menggunakan Kotlin + Retrofit2 + RXJava
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.