開胃菜
話不多說,30s倒計時開始,先來看看如何發(fā)送一個Get請求,如下:
RxHttp.get("http://...") //第一步,確定請求類型,這里為Get請求
.asString() //第二步,確定返回類型,這里返回String類型
.subscribe(s -> { //第二步,訂閱觀察者,第二步返回Observable對象
//請求成功
}, throwable -> {
//請求失敗
});
Ok,倒計時結(jié)束!??! 到這,你已經(jīng)學(xué)會了RxHttp的精髓。
是的,不用懷疑,就是這么簡單,使用RxHttp,任意請求,任意返回數(shù)據(jù)類型,都遵循這三個步驟,我們稱之為請求三部曲。
重要事情說3遍
任意請求,任意返回數(shù)據(jù)類型,皆遵循請求三部曲
任意請求,任意返回數(shù)據(jù)類型,皆遵循請求三部曲
任意請求,任意返回數(shù)據(jù)類型,皆遵循請求三部曲
gradle依賴
implementation 'com.rxjava.rxhttp:rxhttp:1.0.9'
//注解處理器,生成RxHttp類,即可一條鏈發(fā)送請求
annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.9'
注:RxHttp類是通過注解處理器自動生成的,故需要您在項目中使用一處注解,然后rebuild 一下項目,RxHttp即可以生成。注解使用,請查看RxHttp 一條鏈發(fā)送請求之注解處理器 Generated API(四)
三部曲解說
到這里相信很多人已經(jīng)有疑問了
- 如果我想發(fā)送Post等其它方式請求呢?
- 文件上傳下載及進(jìn)度的監(jiān)聽呢?
- 我想得到自定義的數(shù)據(jù)類型呢?
這些如何通過三部曲實現(xiàn)呢?別著急,接下來一一為大家講解
第一步,確定請求方式
上面例子中,我們調(diào)用了RxHttp.get("http://...")語句,其中get操作符就代碼Get請求。由此,我們可以猜測,發(fā)送Post請求,只需要調(diào)用post操作符即可。然而我們只猜對了一半,為啥這么說呢?Post請求中,我們常見的又分為兩種,一種的表單形式的Post,另一種是Json字符串形式的Post。為此,RxHttp提供了兩個發(fā)送Post請求的操作符,分別是postForm和postJosn,此時,我們就可以這樣發(fā)送Post請求
RxHttp.postForm("http://...") //發(fā)送表單形式的Post請求
.asString() //返回String類型
.subscribe(s -> { //訂閱觀察者,
//請求成功
}, throwable -> {
//請求失敗
});
RxHttp.postJson("http://...") //發(fā)送Json字符串單形式的Post請求
.asString() //返回String類型
.subscribe(s -> { //訂閱觀察者,
//請求成功
}, throwable -> {
//請求失敗
});
如果想發(fā)送Delete、Put等其它方式的請求,同理,如下:
RxHttp.deleteForm("http://...")
RxHttp.deleteJson("http://...")
RxHttp.putForm("http://...")
RxHttp.putJson("http://...")
//其它請求方式同上
最后,我們來看下,RxHttp都提供了哪些請求方式,如下:
其中
get、postForm、postJson上面已經(jīng)講過了,其它的同理,這里就不再講述了。
請求方式確定了,如何添加參數(shù)或者頭像信息呢?so easy!!!,只需調(diào)用add、addHeader即可,如下:
RxHttp.postForm("http://...") //發(fā)送表單形式的Post請求
.add("key","value") //添加請求參數(shù),該方法可調(diào)用多次
.addHeader("headerKey","headerValue") //添加請求頭參數(shù),該方法可調(diào)用多次
.asString() //返回String類型
.subscribe(s -> { //訂閱觀察者,
//請求成功
}, throwable -> {
//請求失敗
});
第二步,確定返回數(shù)據(jù)類型
上面的asString操作符代表返回String字符串類型,RxHttp提供了17個asXXX操作符,如下:
其中,asBoolean、asInteger、asLong、asString等,我想很好理解,就是返回基本類型的裝箱類型,這個不就過多講解。這里我們重點看下
asObject、asList、asDownload這3個操作符。
asObject
顯示開發(fā)中,我們返回的更多是自定義的數(shù)據(jù)類型,比如我們想得到一個Student對象,此時,我們就可以用asObject操作符,如下:
RxHttp.get("http://...") //發(fā)送Get請求
.asObject(Student.class) //指定返回User類型數(shù)據(jù)
.subscribe(student -> { //訂閱觀察者,
//請求成功,這里student就是Student對象
}, throwable -> {
//請求失敗
});
asList
然而,如果我們想得到一系列Student對象呢?使用asObject顯然行不通,此時就要用到asList操作符了,如下:
RxHttp.get("http://...") //發(fā)送Get請求
.asList(Student.class) //指定返回User類型數(shù)據(jù)
.subscribe(students -> { //訂閱觀察者,
//請求成功,這里students就是List<Student>對象
}, throwable -> {
//請求失敗
});
注:asXXX操作符,內(nèi)部會默認(rèn)指定請求在
Schedulers.io()線程執(zhí)行
asDownload
當(dāng)我們需要下載文件,就用此操作符,如下:
RxHttp.get("http://...") //Get請求
.asDownload(".../rxhttp.apk") //使用asDownload操作符,并傳入存儲路徑
.subscribe(s -> {
//下載成功回調(diào),s為文件存儲路徑
}, (OnError) throwable -> {
//下載失敗回調(diào)
});
更多文件操作,請查看Android 史上最優(yōu)雅的實現(xiàn)文件上傳、下載及進(jìn)度的監(jiān)聽
第三步,訂閱觀察者
在上一步中,細(xì)心的你也許發(fā)現(xiàn)了,使用了asXXX操作符后,會返回一個Observable對象,那這個又是什么對象呢?其實它就是RxJava內(nèi)部的Observable對象。
在這,可以告訴你,當(dāng)我們調(diào)用asXXX操作符,拿到Observable對象后,RxHttp就已經(jīng)完成了它的使命,接下來的事情都丟給了RxJava。拿到Observable對象,結(jié)合RxJava強(qiáng)大的操作符,我們可以做非常多的事情,比如我們想要在主線程回調(diào)觀察者,如下:
RxHttp.get("http://...") //發(fā)送Get請求
.asList(Student.class) //指定返回User類型數(shù)據(jù)
.observeOn(AndroidSchedulers.mainThread()) //主線程回調(diào)觀察者
.subscribe(students -> { //訂閱觀察者,
//請求成功,這里students就是List<Student>對象
}, throwable -> {
//請求失敗
});
注:請求默認(rèn)在Schedulers.io()線程執(zhí)行,如未指定觀察者所在線程,則默認(rèn)在請求所在線程回調(diào)
小結(jié)
好了,請求三部曲就講解結(jié)束,到這,你已經(jīng)掌握了RxHttp 70% 的功能,并且掌握了RxHttp的精髓----請求三部曲,在任意請求中,就能做到以不變應(yīng)萬變。
本篇文章的目的在于提供一個簡單的入門教程,更多功能請查看
RxHttp 一條鏈發(fā)送請求,新一代Http請求神器(一)
RxHttp 一條鏈發(fā)送請求之強(qiáng)大的數(shù)據(jù)解析功能(二)
RxHttp 一條鏈發(fā)送請求之強(qiáng)大的Param類(三)
RxHttp 一條鏈發(fā)送請求之注解處理器 Generated API(四)
Android 史上最優(yōu)雅的實現(xiàn)文件上傳、下載及進(jìn)度的監(jiān)聽
問題簡答
最后,借此機(jī)會,簡單解答一下讀者反饋的問題
1、RxHttp支持Https嗎?
答:支持,RxHttp內(nèi)置默認(rèn)的OkHttpClient對象,如下:
new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.sslSocketFactory(sslSocketFactory, trustAllCert) //添加信任證書
.hostnameVerifier((hostname, session) -> true) //忽略host驗證
.build();
2、RxHttp支持緩存處理嗎?
答:支持,但是RxHttp默認(rèn)沒有做任何緩存處理,如有需要,請自定義OkHttpClient對象開啟緩存,并使用RxHttp發(fā)送請求時,使用cacheControl(CacheControl cacheControl)設(shè)置緩存策略
3、RxHttp如何支持session或者token?
答:session或者token涉及到具體的業(yè)務(wù)邏輯,故RxHttp暫時并沒有做深度封裝。如有需要,可自定義OkHttpClient對象通過攔截器去實現(xiàn)。
4、RxHttp支持kotlin嗎?
答:必須支持,但是依賴注解處理器時,需要使用kapt代替annotationProcessor
5、RxHttp如何支持多任務(wù)列表下載
答:在最新的Demo中,已有案例,歡迎下載Demo體驗
在使用過程中,如遇到什么問題,環(huán)境加群交流RxHttp&RxLife 交流群:378530627