国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
在线观看免费高清完整| 久久99亚洲网美利坚合众国| 精品国语对白精品自拍视| 五月天天在线| 国产视频二区| 2018中文字幕在线观看| 99久久精品免费观看国产| 99久久国产视频| sm国产在线调教视频| 欧美婷婷久久五月精品三区| 国产伦精品一区二区三区高清版禁 | 国产精品视频h| 精品入口蜜桃| 久久久久久五月天久久久久久久久| 久草福利资源在线视频| 国产日韩欧美第一页| av在线播放av| 综合激情丁香| www.狠狠| 在线黄色.com| 国产一区二区三区福利| 在线视频中文字幕| 中文字幕在线视频免费观看| 国产经典自拍视频在线观看| 久久久久国产精品嫩草影院| 96久久久久久| 国产视频福利在线| 九九视频九九热| japanese色国产在线看视频| 国产性一级片| 高潮毛片在线观看| 男女午夜视频在线观看| 精品欧美不卡一区二区在线观看| 国产蜜臀在线| 福利视频网站导航| 久久久久久五月天久久久久久久久| 91社区在线观看| 精精国产xxxx视频在线动漫| 国产福利在线免费观看| 国产二区视频| 夜色资源网av在先锋网站观看| 91亚洲欧美| av首页在线| 人人九九精品| www在线观看播放免费视频日本| 在线免费看黄| 日本成人免费网站| 久久久久久国产视频| 黄色av免费看| 国产精品午夜久久久久久| 久久久久久日本一区99| 麻豆精品永久免费视频| 九七电影韩国女主播在线观看| 在线视频99| 欧美亚洲天堂| 天堂资源在线中文| 国产三级免费观看| av激情在线| 国产免费福利| 国产成人精品实拍在线| av亚洲男人天堂| 非洲黑人最猛性xxxx交| 国产日韩欧美第一页| 国产福利电影在线观看| av中文字幕在线看| 国产乱妇乱子在线播视频播放网站 | 四虎网站在线观看| 久热中文字幕| 中文字幕高清av| 99热免费在线观看| 国产在线超碰| 97福利电影| 好男人免费精品视频| 国产福利在线观看| 激情综合网五月激情| 国产特级嫩嫩嫩bbb| 亚洲激情丁香| 国产人成在线观看| 日韩不卡高清| 精品美女在线观看视频在线观看 | 永久免费不卡在线观看黄网站| 白浆爆出在线观看| 国产二区三区四区| 天堂资源在线中文| www.麻豆av.com| 97在线免费| 国产一卡2卡3卡4卡网站免费| 日韩国产成人| 亚洲久草视频| 中文字幕2020第一页| 国产午夜视频| 国产一级性片| 天堂在线免费观看| 成年黄网站在线观看免费| 一级二级三级在线观看| 精精国产xxxx视频在线| 国产精品久久在线| 国产三级做爰在线观看| 国产有码在线| 粉嫩av一区| 国产网红在线| 国产女呦网站| 免费特级黄毛片| 日本电影在线观看| 亚洲精品国自产拍在线观看| 国产成人精品实拍在线| 国产精品麻豆一区二区三区| 青青草中文字幕| 国产69精品久久久久孕妇国产69久久| 日本调教视频在线观看| 精精国产xxxx视频在线中文版| 国产激情视频一区二区| 精品视频一二区| 在线国产网址| xxx国产精品| 国产性色视频| 在线视频福利| 久久精品国产亚洲a∨麻豆| 国产在线观看18| 国产成人亚洲欧美电影| 亚洲成人在线播放| 国产中文伊人| 国产精品美女一区二区三区四区 | 国产精品福利视频一区二区三区| 国产丝袜在线播放| 97在线免费| 国产在线www| 在线三级av| 国产乱xxⅹxx国语对白| 国产天堂av| 日本精品一区二区三区在线播放| 久久综合第一页| 中文字幕在线免费| 中文字幕av免费| 午夜不卡视频| 精品伦理一区二区| 最近免费中文字幕在线第一页| 国产va在线观看| 久久久久久久久久久久久91| 国产视频中文字幕在线观看| www.夜夜操.com| 国产成免费视频| 好男人社区在线视频| 99久久国产视频| 国产精品不卡一区二区三区在线观看| 欧美日韩不卡中文字幕在线| 精品国产高清自在线一区二区三区 | 国产69久久| 亚洲国产成人综合| 99久久99久久免费精品小说| 国产偷窥洗澡视频| 激情在线视频播放| eeuss影院在线观看| av大片在线| 精品999视频| 在线天堂av| 在线激情网站| www.91在线播放| 亚洲国产精品区| av在线播放av| 日本视频一二三区中文字幕| 国产xxx在线| 国产成人精品18| 国产成人综合美国十次| 国产黄色高清在线| 午夜国产视频| 国产精品白浆流出视频| 7777在线| 欧美日韩一区二区三区视视频| 亚洲国产精品区| 日本黄色免费网址| 国产在线激情视频| 日本中文字幕视频在线| 最好2018中文免费视频| 国产特黄在线| 在线免费观看黄色av| 在线免费看黄| 免费在线高清av| 国产伦精品一区二区三区高清版禁 | 国产馆av播放| av在线1区2区| 久久国产热视频| 福利在线观看| 国产日韩精品在线看| av小说在线| 国产羞羞视频在线播放| 亚洲综合在线网| 国产九九在线| 精品国产一区二区三区久久久狼牙 | www.av在线| 国产一级二级在线| 2020中文字幕在线播放| www亚洲天堂| 2020中文字幕在线播放| 久热国产在线| 精品欧美不卡一区二区在线观看| 青草av在线| 国产精品xxx电影| 国产中文在线视频| 亚洲免费国产|