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

首頁(yè) > 開(kāi)發(fā) > Java > 正文

Kotlin結(jié)合Rxjava+Retrofit實(shí)現(xiàn)極簡(jiǎn)網(wǎng)絡(luò)請(qǐng)求的方法

2024-07-21 23:03:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

因?yàn)樽罱趯懙捻?xiàng)目集成了兩個(gè)網(wǎng)絡(luò)請(qǐng)求框架(Volley and Retrofit)對(duì)比之下也是選擇了Retrofit。既然選擇那自然要讓自己以后開(kāi)發(fā)更加省力(就是懶)。于是我在Retrofit中加入了Rxjava,這也是當(dāng)下蠻流行的一個(gè)請(qǐng)求框架。然后又利用了Kotlin的一些新特性,使網(wǎng)絡(luò)請(qǐng)求變得特別簡(jiǎn)單,代碼量特別少。

Kotlin,Rxjava,Retrofit,網(wǎng)絡(luò)請(qǐng)求

Kotlin鎮(zhèn)樓

RxJava

RxJava學(xué)習(xí)是一個(gè)曲折漫長(zhǎng)的過(guò)程,但一旦掌握,妙用無(wú)窮。

Retrofit

Retrofit與okhttp共同出自于Square公司,retrofit就是對(duì)okhttp做了一層封裝。把網(wǎng)絡(luò)請(qǐng)求都交給給了Okhttp,我們只需要通過(guò)簡(jiǎn)單的配置就能使用retrofit來(lái)進(jìn)行網(wǎng)絡(luò)請(qǐng)求了,其主要作者是Android大神JakeWharton。

導(dǎo)包:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包c(diǎn)ompile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依賴包c(diǎn)ompile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依賴包

*這里需要值得注意的是:導(dǎo)入的retrofit2包的版本必須要一致,否則就會(huì)報(bào)錯(cuò)。

正文

導(dǎo)包

首先需要導(dǎo)入相關(guān)的包,包括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傳入的是一個(gè)OkhttpClient,這里我們需要?jiǎng)?chuàng)建一個(gè)OkhttpClient對(duì)象,這個(gè)可以用來(lái)加入一些攔截器、連接等待時(shí)間等,以下是我的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

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

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

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

interface RetrofitUrl { //方法名自定義 @GET("接口地址") fun load():Observable<對(duì)應(yīng)實(shí)體類> @FormUrlEncoded @Post("接口地址") fun load():Observable<對(duì)應(yīng)實(shí)體類> //需要傳遞參數(shù),多個(gè)參數(shù)逗號(hào)隔開(kāi) @GET("接口地址") fun load(@Query("參數(shù)名字") 參數(shù)名字(可自定義):參數(shù)類型):Observable<對(duì)應(yīng)實(shí)體類> @FormUrlEncoded @Post("接口地址") fun load(@Field("參數(shù)名字") 參數(shù)名字(可自定義):參數(shù)類型):Observable<對(duì)應(yīng)實(shí)體類> //示例 @GET("load") fun load():Observable<NetOuter<Orgs>> @GET("load") fun load(@Query("id") id:Int):Observable<NetOuter<Orgs>>}

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

請(qǐng)求網(wǎng)絡(luò)

以上都做完了就可以開(kāi)始請(qǐng)求網(wǎng)絡(luò)了。

通過(guò)Application獲取到Retrofit后,我們就可以通過(guò)它去調(diào)用我們剛剛在接口中定義的方法,因?yàn)榕渲昧薘xJava,所以調(diào)用方法后會(huì)返回一個(gè)Observable,這也是我們?cè)诮涌谥卸x的返回類型,如果沒(méi)有添加RxJava,返回類型為Call。這樣子我們就可以按照RxJava的習(xí)慣去寫了:

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

這樣子我們就完成了一個(gè)網(wǎng)絡(luò)請(qǐng)求,這里就進(jìn)行了線程調(diào)度的操作,具體看操作者的需求,也可以加入以下RxJava的操作符。
雖然這樣子可以進(jìn)行網(wǎng)絡(luò)請(qǐng)求,可如果每次請(qǐng)求都要去寫線程調(diào)度又覺(jué)得太麻煩了,都是一樣的代碼。這時(shí)候我們就用到了Kotlin的一個(gè)特性,擴(kuò)展函數(shù)。我們新建一個(gè)Kotlin File文件,在其中寫入我們修改了的代碼:

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

讓我們調(diào)調(diào)這個(gè)方法看看效果:

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

通過(guò)這一層的封裝,省去了線程調(diào)度的代碼,在大量請(qǐng)求的時(shí)候,可以省去不少代碼。但是,就這個(gè)程度,還是覺(jué)得要一直寫object : Subscriber...,這個(gè)也不想寫,懶嘛。怎么辦?只能繼續(xù)封裝,這時(shí)候就想到了Kotlin的另一個(gè)特性,高階函數(shù)。Kotlin允許把一個(gè)方法當(dāng)做一個(gè)參數(shù)進(jìn)行使用,使用時(shí)通過(guò)Lambda的方式展示,一樣在我們剛剛寫runRx那個(gè)文件:

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) } })}

這里通過(guò)next:(T)->Unit將方法當(dāng)做一個(gè)參數(shù),其中next為這個(gè)參數(shù)的參數(shù)名字,冒號(hào)后面的括號(hào)里面為這個(gè)方法需要的參數(shù),多個(gè)參數(shù)逗號(hào)隔開(kāi),Unit是返回類型,Unit相當(dāng)于Java中的void。其中還看到了completed:() -> Unit = { Log.e("completed","completed") }這里用到了Kotlin的參數(shù)默認(rèn)值,通過(guò)=號(hào)將右邊當(dāng)做左邊方法的默認(rèn)實(shí)現(xiàn),如果操作者沒(méi)有實(shí)現(xiàn)這個(gè)方法,就用這個(gè)默認(rèn)操作。runRxLambda的方法內(nèi)也就是調(diào)用了我們剛剛寫的runRx方法,然后將對(duì)應(yīng)的方法傳入就可以了。接下來(lái)看看效果:

runRxLambda(retrofit().load(),{ //我們?cè)谶@里的操作就相當(dāng)于在onNext中的操作,參數(shù)可以通過(guò)it獲取 },{ //這里就是onError的實(shí)現(xiàn),參數(shù)也可以通過(guò)it獲取 })runRxLambda(retrofit().load(),{ //我們?cè)谶@里的操作就相當(dāng)于在onNext中的操作,參數(shù)可以通過(guò)it獲取 },{ //這里就是onError的實(shí)現(xiàn),參數(shù)也可以通過(guò)it獲取 },{ //這里是onCompleted,不實(shí)現(xiàn)也可以 })

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,這里的一些實(shí)現(xiàn)方式不止用在這里,這篇文章也只是當(dāng)做一個(gè)拋磚引玉,其中可能也有很多操作不到位,講的不到位的,希望噴的小聲點(diǎn),希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到kotlin教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲美女黄色片| 国产美女永久无遮挡| 欧美69xxx| 成人丝袜18视频在线观看| 日韩中文视频| 美女精品视频| 肉丝袜脚交视频一区二区| 国产伦精品一区二区三区视频小说| 国产成人精品777777| 日韩精品欧美大片| 国产又粗又猛又爽又黄91| 乱小说综合网站| 午夜在线观看免费一区| 欧美 国产 日本| 国产69精品久久久久9| jizzjizzjizz中国| 手机看片日韩国产| 麻豆蜜桃91| 日韩在线视频不卡| 日本少妇xxx| 日本最黄一级片免费在线| 无码中文字幕色专区| 欧美日韩情趣电影| 韩剧1988在线观看免费完整版| 开心激情五月婷婷| 欧美私人免费视频| 欧美在线一区视频| 欧美裸体一区二区三区| 精品捆绑美女sm三区| 热久久最新网址| 男人天堂视频网| a视频在线观看| 国产亚洲欧美一区二区三区| 亚洲iv一区二区三区| 奇门遁甲1982国语版免费观看高清| 精品蜜桃一区二区三区| 久久久久久久一区二区| 成人午夜在线视频一区| 亚洲a一区二区| 亚洲影院色在线观看免费| 精品中文字幕在线播放| 欧美巨大黑人极品精男| 中文字幕一区在线播放| 亚洲高清黄色| 亚洲综合自拍| 成人h动漫精品一区二区下载| 在线观看视频一区二区欧美日韩| 亚洲第一导航| 欧美电影三区| 高清在线观看免费韩剧| 1234区中文字幕在线观看| 久久成人国产精品入口| 51亚洲精品| 国产视频福利| 欧美又黄又嫩大片a级| 免费大片黄在线观看视频网站| 亚洲国产激情一区二区三区| 大陆精大陆国产国语精品| 精品久久久网站| 欧美著名女优| 亚洲色图视频免费播放| 日本黄区免费视频观看| 一区二区日韩| 宅男一区二区三区| 在线观看一区二区精品视频| 色噜噜在线观看| av成人app永久免费| 久久亚洲AV无码| 精品欧美国产一区二区三区| 欧美xxav| 大色综合视频网站在线播放| 国产精品第56页| 国内老熟妇对白xxxxhd| 五月天精品在线| 欧美精品二区| 国产最新自拍视频| 国产精品调教视频| 在线亚洲日本| 日韩三级免费观看| 午夜精品久久久久久久久久蜜桃| 又黄又爽在线观看| 亚洲美女网站18| av在线不卡免费观看| 97精品国产97久久久久久免费| 中文精品视频一区二区在线观看| 在线观看精品自拍视频| 欧美少妇一级片| 伊人成色综合网| 99久久精品国产导航| 亚洲视频在线观看日本a| 韩国精品一区二区三区| 免费看成人午夜电影| 精品91福利视频| 图片区乱熟图片区亚洲| 美女国产一区二区| 蜜桃免费在线视频| 奇米四色…亚洲| 亚洲欧美色图小说| 人妻体内射精一区二区| 懂色一区二区三区av片| 天天操夜夜操很很操| 亚洲国产精品99久久久久久久久| 538在线观看| 久久精品主播| xfplay资源站色先锋在线观看| 97干com| 综合久久十次| 国产天堂av| 粗大的内捧猛烈进出在线视频| 妖精视频在线观看免费| 最近中文字幕免费mv2018在线| 女人天堂av在线播放| 亚洲精品一级二级| 日韩精品在线看| 在线视频免费一区二区| 久热在线中文字幕色999舞| 久久66热re国产毛片基地| 不卡av影片| 国产日韩欧美不卡在线| 久久精品这里只有精品| 亚洲精品成人天堂一二三| 黄色免费大全亚洲| 中文字幕久久av| 欧美一区二区三区的| 精品黑人一区二区三区国语馆| 久久69av| 国产又粗又猛又黄又爽| 欧美五级在线观看视频播放| 久久夜色精品国产亚洲aⅴ| 欧美日韩一区综合| 欧美一级免费播放| 成人美女av在线直播| 国产成人精品一区二区| 欧美日本高清一区| 国产美女视频91| 涩视频在线观看| 在线精品一区二区| 波多野结衣 作品| 高清视频国产| 亚洲精品高清视频| 无码人妻一区二区三区免费| av最新在线观看| 国产精品一区在线观看乱码| 韩国精品免费视频| 欧美色图一区二区| 欧美精品一区二区性色a+v| 日韩经典一区二区| 妖精视频在线观看| 日本一区精品| 午夜免费视频网站| 欧美日韩小视频| 日韩精品视频在线观看网址| 国产精品免费区二区三区观看| 久久视频免费观看| 国产高清不卡二三区| 比比资源-先锋影音资源站| 久久精子c满五个校花| 亚洲在线观看| 性爱视频在线播放| eeuss影院www在线观看免费| www.黄色小说.com| 欧美久久高跟鞋激| 懂色av成人一区二区三区| 天堂а√在线中文在线新版| a级网站在线观看| 国产一区二区三区亚洲综合| 一级黄色在线| 色婷婷亚洲mv天堂mv在影片| 97视频com| 日韩av地址| 日本10禁啪啪无遮挡免费一区二区| 男男视频亚洲欧美| 杨幂一区二区三区免费看视频| 青青草手机视频在线观看| 欧美午夜电影网| 日韩欧美一二区| 精品免费囯产一区二区三区| 在线视频中文字幕第一页| 久草视频在线资源| 日本欧美久久久久免费播放网| 国产高潮流白浆| 欧美成人免费看| 国产精品久免费的黄网站| 玉米视频成人免费看| 国产精品人成电影在线观看| 日韩av在线网址| 午夜在线成人av| 久久久9色精品国产一区二区三区| 精品久久在线观看| 91国产精品成人| 国产精品久久久久久久久图文区| 夜级特黄日本大片_在线| 在线观看中文字幕网站| 久久五月激情| 美乳视频一区二区| 爽爽爽在线观看| 亚洲乱色熟女一区二区三区| 色多多国产成人永久免费网站| 18在线观看的| 精品少妇一区二区三区在线播放| 精品亚洲一区二区三区| 久久精品国产成人精品| 色之综合天天综合色天天棕色| 久久精品一卡二卡| 成人小视频在线观看| 精品视频色一区| 成人在线视频福利| 激情偷乱视频一区二区三区| 欧美黄色免费看| 黄色成人一级片| 国产精品婷婷午夜在线观看| 久久精品这里都是精品| 69xxxx视频| 国产精品久av福利在线观看| 成人片在线免费看| 久久高清免费观看| 国产xxxxx视频| 秘密影院久久综合亚洲综合| 欧美一级日韩免费不卡| www.欧美亚洲| 亚洲欧美日韩一二三区| 亚洲一区二区久久久| 亚洲欧美视频| 精品国产av一区二区| 97久久久久久久| 日韩在线观看视频一区二区| 亚洲高清不卡一区| 99视频在线观看一区三区| 久久精品免视看| 日韩一区精品字幕| 国产精品视频一区二区三区经| 国产农村妇女aaaaa视频| 一级特黄aaa大片在线观看| a亚洲天堂av| 国语精品一区| 亚洲成人先锋电影| 成人免费观看49www在线观看| 日本一级片免费看| 国产精品高潮粉嫩av| 亚洲国产三级网| 日韩有码中文字幕在线| 一区二区欧美在线| 国产成人8x视频一区二区| 91中文字幕永久在线| 欧美孕妇性xx| 无码国产精品一区二区免费式直播| 成人欧美一区二区三区黑人| 欧美禁忌电影网| 国产亚洲小视频| 亚洲妇熟xxxx妇色黄| 18岁以下禁止观看的美女视频| 亚洲青青一区| 亚洲1区2区3区4区| 免费毛片aaaaaa| 亚洲精品国产a| 国产偷激情在线| 天天曰天天操| 亚洲国产一区二区在线观看| 视频在线观看国产精品| 日韩毛片免费观看| 日韩精品久久理论片| 久久久久国产一区二区三区| h视频久久久| 中文字幕 欧美日韩| 亚洲一区二区精品视频| 国产精品高潮久久久久无| 亚洲一卡二卡三卡四卡无卡久久| 91精品国产美女浴室洗澡无遮挡| 中文字幕高清在线观看| 国产成人精品在线看| 国内精品视频666| 亚洲一区二区三区三州| 国产欧美自拍一区| 无码人妻熟妇av又粗又大| 亚洲一区二区三区美女| 亚洲欧洲另类精品久久综合| 国产精品三级网站| 成人av免费在线观看| 久久夜色撩人精品| 免费精品99久久国产综合精品应用| 欧美有码在线| 国产一区二区在线免费| 伦伦影院午夜日韩欧美限制| 免费视频91蜜桃| 一区二区三区网| 影音先锋在线中文字幕| 成人黄色在线免费观看| 欧美亚洲天堂网| 欧美视频在线不卡| 久久久久久蜜桃一区二区| 欧美巨大丰满猛性社交| 久久精品日产第一区二区| 精品小视频在线| 韩日欧美一区二区| 国模无码一区二区三区| 午夜伦欧美伦电影理论片| 一本到三区不卡视频| 深夜视频一区二区| 91ts人妖另类精品系列| 青娱乐免费在线视频| 神马久久久久久久久久| 久久91成人| 国产亚洲激情视频在线| 亚洲av无码一区东京热久久| 伊人免费视频二| 精品视频1区2区3区| 欧美激情自拍| 91在线高清观看| 男女午夜激烈无遮挡| 国产精品亚洲产品| 中文字幕 国产精品| 九九九九九九精品任你躁| 亚洲色图第一页| 国产亚洲亚洲国产一二区| 午夜国产不卡在线观看视频| 九色91popny| 久热精品在线播放| 国产免费一区二区视频| 久久亚洲国产精品日日av夜夜| 日韩精品专区在线影院观看| 在线不卡中文字幕| 亚洲影院色无极综合| 国产91色在线|亚洲| 亚洲人成人77777线观看| 一个人看的www视频免费在线观看| 午夜啪啪免费视频| 国产精欧美一区二区三区蓝颜男同| 日韩电影免费看|