開胃菜
話不多說芥颈,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等其它方式請求呢航徙?
- 文件上傳下載及進度的監(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)部會默認指定請求在
Schedulers.io()
線程執(zhí)行
asDownload
當我們需要下載文件争群,就用此操作符回怜,如下:
RxHttp.get("http://...") //Get請求
.asDownload(".../rxhttp.apk") //使用asDownload操作符,并傳入存儲路徑
.subscribe(s -> {
//下載成功回調(diào)换薄,s為文件存儲路徑
}, (OnError) throwable -> {
//下載失敗回調(diào)
});
更多文件操作玉雾,請查看Android 史上最優(yōu)雅的實現(xiàn)文件上傳、下載及進度的監(jiān)聽
第三步轻要,訂閱觀察者
在上一步中复旬,細心的你也許發(fā)現(xiàn)了,使用了asXXX
操作符后冲泥,會返回一個Observable
對象驹碍,那這個又是什么對象呢?其實它就是RxJava內(nèi)部的Observable
對象凡恍。
在這志秃,可以告訴你,當我們調(diào)用asXXX
操作符嚼酝,拿到Observable
對象后浮还,RxHttp就已經(jīng)完成了它的使命,接下來的事情都丟給了RxJava革半。拿到Observable
對象碑定,結(jié)合RxJava強大的操作符流码,我們可以做非常多的事情又官,比如我們想要在主線程回調(diào)觀察者,如下:
RxHttp.get("http://...") //發(fā)送Get請求
.asList(Student.class) //指定返回User類型數(shù)據(jù)
.observeOn(AndroidSchedulers.mainThread()) //主線程回調(diào)觀察者
.subscribe(students -> { //訂閱觀察者漫试,
//請求成功,這里students就是List<Student>對象
}, throwable -> {
//請求失敗
});
注:請求默認在Schedulers.io()線程執(zhí)行六敬,如未指定觀察者所在線程,則默認在請求所在線程回調(diào)
小結(jié)
好了驾荣,請求三部曲就講解結(jié)束外构,到這普泡,你已經(jīng)掌握了RxHttp 70% 的功能,并且掌握了RxHttp的精髓----請求三部曲审编,在任意請求中撼班,就能做到以不變應(yīng)萬變。
本篇文章的目的在于提供一個簡單的入門教程垒酬,更多功能請查看
RxHttp 一條鏈發(fā)送請求砰嘁,新一代Http請求神器(一)
RxHttp 一條鏈發(fā)送請求之強大的數(shù)據(jù)解析功能(二)
RxHttp 一條鏈發(fā)送請求之強大的Param類(三)
RxHttp 一條鏈發(fā)送請求之注解處理器 Generated API(四)
Android 史上最優(yōu)雅的實現(xiàn)文件上傳、下載及進度的監(jiān)聽
問題簡答
最后勘究,借此機會矮湘,簡單解答一下讀者反饋的問題
1、RxHttp支持Https嗎口糕?
答:支持缅阳,RxHttp內(nèi)置默認的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發(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