亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Kotlin結合Rxjava+Retrofit實現極簡網絡請求的方法

2024-07-21 23:03:40
字體:
來源:轉載
供稿:網友

前言

因為最近正在寫的項目集成了兩個網絡請求框架(Volley and Retrofit)對比之下也是選擇了Retrofit。既然選擇那自然要讓自己以后開發更加省力(就是懶)。于是我在Retrofit中加入了Rxjava,這也是當下蠻流行的一個請求框架。然后又利用了Kotlin的一些新特性,使網絡請求變得特別簡單,代碼量特別少。

Kotlin,Rxjava,Retrofit,網絡請求

Kotlin鎮樓

RxJava

RxJava學習是一個曲折漫長的過程,但一旦掌握,妙用無窮。

Retrofit

Retrofit與okhttp共同出自于Square公司,retrofit就是對okhttp做了一層封裝。把網絡請求都交給給了Okhttp,我們只需要通過簡單的配置就能使用retrofit來進行網絡請求了,其主要作者是Android大神JakeWharton。

導包:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依賴包compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依賴包

*這里需要值得注意的是:導入的retrofit2包的版本必須要一致,否則就會報錯。

正文

導包

首先需要導入相關的包,包括Rxjava(我這里使用的是1.x的版本,如果你使用的是2.x的版本影響不大)、Retrofit。

 //Rxjava compile 'io.reactivex:rxandroid:1.2.0' compile 'io.reactivex:rxjava:1.2.0' //Retrofit compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0' compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'

初始化Retrofit

 retrofit = Retrofit.Builder()  .client(build.build())  .baseUrl("你的url")  .addConverterFactory(GsonConverterFactory.create(gson))  .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  .build().create(RetrofitUrl::class.java)

client傳入的是一個OkhttpClient,這里我們需要創建一個OkhttpClient對象,這個可以用來加入一些攔截器、連接等待時間等,以下是我的client:

 val build = OkHttpClient.Builder().connectTimeout(15,TimeUnit.SECONDS)  .writeTimeout(15,TimeUnit.SECONDS)  .readTimeout(15,TimeUnit.SECONDS) val logging = HttpLoggingInterceptor(HttpLoggingInterceptor.Logger {  Log.e("retrofit url",it) }) logging.level = HttpLoggingInterceptor.Level.BODY

我這里只設置了連接、讀、寫超時時間和一個攔截器,用于在用Retrofit請求網絡的時候可以獲取到請求的信息。然后是baseUrl這里是設置網絡請求的通用的地址,格式類似于http://ip:端口/后臺項目名/,需要以/結尾。而后的addConverterFactory和addCallAdapterFactory是我們剛剛導入的包,用于添加gson和RxJava支持,其中如果解析的時候有要求時間格式,可自定義一個gson傳入:

val gson = GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create()

如果不要求時間格式,GsonConverterFactory.create(此處可以不傳參數)。然后就是RetrofitUrl,這是一個接口,名字可以根據個人喜好進行定義,其內放置請求的接口:

interface RetrofitUrl { //方法名自定義 @GET("接口地址") fun load():Observable<對應實體類> @FormUrlEncoded @Post("接口地址") fun load():Observable<對應實體類> //需要傳遞參數,多個參數逗號隔開 @GET("接口地址") fun load(@Query("參數名字") 參數名字(可自定義):參數類型):Observable<對應實體類> @FormUrlEncoded @Post("接口地址") fun load(@Field("參數名字") 參數名字(可自定義):參數類型):Observable<對應實體類> //示例 @GET("load") fun load():Observable<NetOuter<Orgs>> @GET("load") fun load(@Query("id") id:Int):Observable<NetOuter<Orgs>>}

以上就是初始化大概過程,初始化我是放在了自定義的Application中完成,使用時通過Application獲取到Retrofit。

請求網絡

以上都做完了就可以開始請求網絡了。

通過Application獲取到Retrofit后,我們就可以通過它去調用我們剛剛在接口中定義的方法,因為配置了RxJava,所以調用方法后會返回一個Observable,這也是我們在接口中定義的返回類型,如果沒有添加RxJava,返回類型為Call。這樣子我們就可以按照RxJava的習慣去寫了:

 retrofit().load()  .subscribeOn(Schedulers.io())  .observeOn(AndroidSchedulers.mainThread())  .subscribe(object :Subscriber<NetOuter<Orgs>>(){  override fun onCompleted() {      }  override fun onNext(t: NetOuter<Orgs>?) {    //可以在這里對獲取到的數據進行處理  }  override fun onError(e: Throwable?) {    //請求失敗  }  )

這樣子我們就完成了一個網絡請求,這里就進行了線程調度的操作,具體看操作者的需求,也可以加入以下RxJava的操作符。
雖然這樣子可以進行網絡請求,可如果每次請求都要去寫線程調度又覺得太麻煩了,都是一樣的代碼。這時候我們就用到了Kotlin的一個特性,擴展函數。我們新建一個Kotlin File文件,在其中寫入我們修改了的代碼:

fun <T> runRx(observable: Observable<T>, subscriber: Subscriber<T>): Subscription =  observable.subscribeOn(Schedulers.io())  .observeOn(AndroidSchedulers.mainThread())  .subscribe(subscriber)

讓我們調調這個方法看看效果:

runRx(retrofit().load(),object : Subscriber<NetOuter<Orgs>>() { override fun onCompleted() {} override fun onNext(t: NetOuter<Orgs>?) {   //可以在這里對獲取到的數據進行處理 } override fun onError(e: Throwable?) {   //請求失敗 })

通過這一層的封裝,省去了線程調度的代碼,在大量請求的時候,可以省去不少代碼。但是,就這個程度,還是覺得要一直寫object : Subscriber...,這個也不想寫,懶嘛。怎么辦?只能繼續封裝,這時候就想到了Kotlin的另一個特性,高階函數。Kotlin允許把一個方法當做一個參數進行使用,使用時通過Lambda的方式展示,一樣在我們剛剛寫runRx那個文件:

fun <T> runRxLambda(observable: Observable<T>,next:(T)->Unit,error:(e: Throwable?)->Unit,completed:() -> Unit = { Log.e("completed","completed") }){ runRx(observable, object : Subscriber<T>() { override fun onCompleted() { completed } override fun onNext(t: T) { next(t) } override fun onError(e: Throwable?) { error(e) } })}

這里通過next:(T)->Unit將方法當做一個參數,其中next為這個參數的參數名字,冒號后面的括號里面為這個方法需要的參數,多個參數逗號隔開,Unit是返回類型,Unit相當于Java中的void。其中還看到了completed:() -> Unit = { Log.e("completed","completed") }這里用到了Kotlin的參數默認值,通過=號將右邊當做左邊方法的默認實現,如果操作者沒有實現這個方法,就用這個默認操作。runRxLambda的方法內也就是調用了我們剛剛寫的runRx方法,然后將對應的方法傳入就可以了。接下來看看效果:

runRxLambda(retrofit().load(),{ //我們在這里的操作就相當于在onNext中的操作,參數可以通過it獲取 },{ //這里就是onError的實現,參數也可以通過it獲取 })runRxLambda(retrofit().load(),{ //我們在這里的操作就相當于在onNext中的操作,參數可以通過it獲取 },{ //這里就是onError的實現,參數也可以通過it獲取 },{ //這里是onCompleted,不實現也可以 })

總結

以上就是這篇文章的全部內容了,這里的一些實現方式不止用在這里,這篇文章也只是當做一個拋磚引玉,其中可能也有很多操作不到位,講的不到位的,希望噴的小聲點,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品亚洲精品| 成人免费看黄网站| 国产精品美女久久久免费| 韩国三级电影久久久久久| 日韩亚洲精品视频| 97视频在线免费观看| 91精品国产色综合久久不卡98| 中文欧美日本在线资源| 欧美大人香蕉在线| 亚洲天堂第二页| 精品久久久香蕉免费精品视频| 欧美激情精品久久久久久大尺度| 久久久午夜视频| 在线观看日韩www视频免费| 精品久久久国产| 中文字幕亚洲自拍| 国产欧美一区二区| 国产精品日韩在线一区| 久久久精品亚洲| 国产一区二区三区毛片| 国产亚洲精品久久| 亚洲欧美国产精品| 亚洲国产天堂久久综合网| 中文字幕最新精品| 国产精品毛片a∨一区二区三区|国| 日韩精品高清在线| 中文字幕亚洲欧美日韩高清| 中文字幕视频在线免费欧美日韩综合在线看| 久久久久久久久久久久av| 91九色在线视频| 久久亚洲精品网站| 欧美理论电影在线观看| 精品国产一区二区三区在线观看| 国产亚洲一区精品| 日韩在线观看你懂的| 亚洲综合一区二区不卡| 国产精品亚洲网站| 日韩精品在线影院| 国产又爽又黄的激情精品视频| 国内精品久久久久久中文字幕| 亚洲电影免费观看| 岛国av在线不卡| 亚洲免费伊人电影在线观看av| 三级精品视频久久久久| 97超级碰碰人国产在线观看| 成人精品一区二区三区| 在线观看国产成人av片| 欧美激情xxxxx| 日韩欧美a级成人黄色| 亚洲欧美激情另类校园| 欧美激情性做爰免费视频| 亚洲人成欧美中文字幕| 欧美精品aaa| 日韩精品在线免费观看| 成人免费在线视频网址| 91精品国产高清久久久久久91| 精品视频在线播放色网色视频| 久久精品国产亚洲精品| 欧美在线国产精品| 欧美在线性爱视频| 成人性生交大片免费看小说| 国产福利成人在线| 亚洲视频日韩精品| 精品一区二区三区四区| 国产精品白嫩美女在线观看| 国产亚洲激情视频在线| 日韩精品免费在线播放| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品在线91| 国产日韩综合一区二区性色av| 日韩国产一区三区| 国产精品久久久久久av下载红粉| 国产精品永久免费视频| 欧美激情va永久在线播放| 国产成人+综合亚洲+天堂| 日韩av在线精品| 国内免费精品永久在线视频| 国产成人精品视频在线观看| 国产精品美女无圣光视频| 久久久久国产视频| 亚洲午夜性刺激影院| 久久手机精品视频| 欧美一区二区三区四区在线| 欧美成人亚洲成人| 久久久亚洲精品视频| 亚洲欧美日韩精品久久| 日韩美女av在线| 精品视频中文字幕| 亚洲福利视频免费观看| 久久精品小视频| 国产精品视频不卡| 91视频免费网站| 欧美亚洲视频在线观看| 欧美国产视频一区二区| 狠狠色狠狠色综合日日五| 国产精品一区二区三区久久| 国产精品亚洲欧美导航| 久久天天躁狠狠躁夜夜爽蜜月| 日韩视频免费中文字幕| 国产xxx69麻豆国语对白| 亚洲国模精品私拍| 欧美性jizz18性欧美| 日韩人体视频一二区| 欧美在线视频免费| 久久av资源网站| 欧美交受高潮1| 久久久久久久影院| 日韩精品一区二区三区第95| 亚洲一区二区中文字幕| 日韩在线不卡视频| 久久综合久久88| 日韩亚洲一区二区| 国产精品久久久久久av福利软件| 91成人在线播放| 欧美第一黄色网| 亚洲变态欧美另类捆绑| 美女视频久久黄| 51ⅴ精品国产91久久久久久| 日韩欧美精品免费在线| 久久91超碰青草是什么| 成人av色在线观看| 激情久久av一区av二区av三区| 中文字幕亚洲激情| 综合网日日天干夜夜久久| 亚洲欧美日韩直播| 久久国产一区二区三区| 97香蕉超级碰碰久久免费软件| 国产精品69精品一区二区三区| 日韩av在线最新| 国产69精品久久久久久| 色爱精品视频一区| 日韩av中文字幕在线免费观看| 国产成人综合亚洲| 亚洲国产精品va在线观看黑人| 亚洲a区在线视频| 精品久久香蕉国产线看观看亚洲| 成人精品福利视频| 日韩性生活视频| 国产亚洲精品久久久| 在线电影欧美日韩一区二区私密| 久久资源免费视频| 日本精品性网站在线观看| 黄色成人在线播放| 欧美中文字幕在线| 日本午夜在线亚洲.国产| 国产一区二区在线播放| 欧美日韩亚洲激情| 久久久人成影片一区二区三区观看| 国产精品99久久久久久白浆小说| 欧美电影免费观看网站| 国产精品视频免费在线观看| 欧美精品在线极品| 欧美理论电影在线观看| 国产丝袜精品第一页| 亚洲精品视频免费在线观看| 国产精品久久久久久久久久尿| 国产成人精品免费视频| 中文字幕在线看视频国产欧美| 国产精品com| 久久国产精品视频| 国产色综合天天综合网| 欧美极品美女视频网站在线观看免费| 热久久视久久精品18亚洲精品| 久久躁狠狠躁夜夜爽|