開胃菜
話不多說,30s倒計時開始,先來看看如何發送一個Get請求,如下:
RxHttp.get("http://...") //第一步,確定請求類型,這裏爲Get請求 .asString() //第二步,確定返回類型,這裏返回String類型 .subscribe(s -> { //第二步,訂閱觀察者,第二步返回Observable對象 //請求成功 }, throwable -> { //請求失敗 });
Ok,倒計時結束!!! 到這,你已經學會了[RxHttp]的精髓。
是的,不用懷疑,就是這麼簡單,使用RxHttp,任意請求,任意返回數據類型,都遵循這三個步驟,我們稱之爲請求三部曲。
重要事情說3遍
任意請求,任意返回數據類型,皆遵循請求三部曲
任意請求,任意返回數據類型,皆遵循請求三部曲
任意請求,任意返回數據類型,皆遵循請求三部曲
gradle依賴
implementation 'com.rxjava.rxhttp:rxhttp:1.0.8'//註解處理器,生成RxHttp類,即可一條鏈發送請求annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.8'
三部曲解說
到這裏相信很多人已經有疑問了
如果我想發送Post等其它方式請求呢?
文件上傳下載及進度的監聽呢?
我想得到自定義的數據類型呢?
這些如何通過三部曲實現呢?彆着急,接下來一一爲大家講解
第一步,確定請求方式
上面例子中,我們調用了RxHttp.get("http://...")
語句,其中get
操作符就代碼Get請求。由此,我們可以猜測,發送Post請求,只需要調用post
操作符即可。然而我們只猜對了一半,爲啥這麼說呢?Post請求中,我們常見的又分爲兩種,一種的表單形式的Post,另一種是Json字符串形式的Post。爲此,[RxHttp]提供了兩個發送Post請求的操作符,分別是postForm
和postJosn
,此時,我們就可以這樣發送Post請求
RxHttp.postForm("http://...") //發送表單形式的Post請求 .asString() //返回String類型 .subscribe(s -> { //訂閱觀察者, //請求成功 }, throwable -> { //請求失敗 }); RxHttp.postJson("http://...") //發送Json字符串單形式的Post請求 .asString() //返回String類型 .subscribe(s -> { //訂閱觀察者, //請求成功 }, throwable -> { //請求失敗 });
如果想發送Delete、Put等其它方式的請求,同理,如下:
RxHttp.deleteForm("http://...") RxHttp.deleteJson("http://...") RxHttp.putForm("http://...") RxHttp.putJson("http://...")//其它請求方式同上
最後,我們來看下,[RxHttp]都提供了哪些請求方式,如下:
其中get
、postForm
、postJson
上面已經講過了,其它的同理,這裏就不再講述了。
請求方式確定了,如何添加參數或者頭像信息呢?so easy!!!,只需調用add
、addHeader
即可,如下:
RxHttp.postForm("http://...") //發送表單形式的Post請求 .add("key","value") //添加請求參數,該方法可調用多次 .addHeader("headerKey","headerValue") //添加請求頭參數,該方法可調用多次 .asString() //返回String類型 .subscribe(s -> { //訂閱觀察者, //請求成功 }, throwable -> { //請求失敗 });
第二步,確定返回數據類型
上面的asString
操作符代表返回String字符串類型,RxHttp提供了17
個asXXX
操作符,如下:
其中,asBoolean、asInteger、asLong、asString等,我想很好理解,就是返回基本類型的裝箱類型,這個不就過多講解。這裏我們重點看下asObject
、asList
、asDownload
這3個操作符。
asObject
顯示開發中,我們返回的更多是自定義的數據類型,比如我們想得到一個Student對象,此時,我們就可以用asObject
操作符,如下:
RxHttp.get("http://...") //發送Get請求 .asObject(Student.class) //指定返回User類型數據 .subscribe(student -> { //訂閱觀察者, //請求成功,這裏student就是Student對象 }, throwable -> { //請求失敗 });
asList
然而,如果我們想得到一系列Student對象呢?使用asObject顯然行不通,此時就要用到asList
操作符了,如下:
RxHttp.get("http://...") //發送Get請求 .asList(Student.class) //指定返回User類型數據 .subscribe(students -> { //訂閱觀察者, //請求成功,這裏students就是List<Student>對象 }, throwable -> { //請求失敗 });
注:asXXX操作符,內部會默認指定請求在
Schedulers.io()
線程執行
asDownload
當我們需要下載文件,就用此操作符,如下:
RxHttp.get("http://...") //Get請求 .asDownload(".../rxhttp.apk") //使用asDownload操作符,並傳入存儲路徑 .subscribe(s -> { //下載成功回調,s爲文件存儲路徑 }, (OnError) throwable -> { //下載失敗回調 });
第三步,訂閱觀察者
在上一步中,細心的你也許發現了,使用了asXXX
操作符後,會返回一個Observable
對象,那這個又是什麼對象呢?其實它就是RxJava內部的Observable
對象。
在這,可以告訴你,當我們調用asXXX
操作符,拿到Observable
對象後,RxHttp就已經完成了它的使命,接下來的事情都丟給了RxJava。拿到Observable
對象,結合RxJava強大的操作符,我們可以做非常多的事情,比如我們想要在主線程回調觀察者,如下:
RxHttp.get("http://...") //發送Get請求 .asList(Student.class) //指定返回User類型數據 .observeOn(AndroidSchedulers.mainThread()) //主線程回調觀察者 .subscribe(students -> { //訂閱觀察者, //請求成功,這裏students就是List<Student>對象 }, throwable -> { //請求失敗 });
注:請求默認在Schedulers.io()線程執行,如未指定觀察者所在線程,則默認在請求所在線程回調
問題簡答
最後,藉此機會,簡單解答一下讀者反饋的問題
1、RxHttp支持Https嗎?
答:支持,RxHttp內置默認的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默認沒有做任何緩存處理,如有需要,請自定義OkHttpClient對象開啓緩存,並使用RxHttp發送請求時,使用cacheControl(CacheControl cacheControl)
設置緩存策略
3、RxHttp如何支持session或者token?
答:session或者token設計到具體的業務邏輯,故RxHttp暫時並沒有做深度封裝。如有需要,可自定義OkHttpClient對象通過攔截器去實現。
4、RxHttp支持kotlin嗎?
答:必須支持,但是依賴註解處理器時,需要使用kapt代替annotationProcessor
5、RxHttp如何支持多任務列表下載
答:在最新的Demo中,已有案例,歡迎下載Demo體驗
最後贈送福利:
於Android進階的全部學習內容,我們這邊都有系統的知識體系以及進階視頻資料,有需要的朋友可以加羣免費領取安卓進階視頻教程,源碼,面試資料,羣內有大牛一起交流討論技術;818520403
(包括自定義控件、NDK、架構設計、混合式開發工程師(React native,Weex)、性能優化、完整商業項目開發等)