RxHttp截止本文發(fā)表已經(jīng)推廣了4個(gè)禮拜,目前已經(jīng)有了141個(gè)star,如下:
本文將在RxHttp的基礎(chǔ)上帶大家如何優(yōu)雅的設(shè)置BaseUrl,如果您還未了解RxHttp,請(qǐng)移步
RxHttp 一條鏈發(fā)送請(qǐng)求,新一代Http請(qǐng)求神器(一)
RxHttp 一條鏈發(fā)送請(qǐng)求之強(qiáng)大的數(shù)據(jù)解析功能(二)
RxHttp 一條鏈發(fā)送請(qǐng)求之強(qiáng)大的Param類(三)
RxHttp 一條鏈發(fā)送請(qǐng)求之注解處理器 Generated API(四)
為何要重復(fù)造輪子RxHttp一經(jīng)推出,就有人問(wèn):難道Retrofit不好用嗎?為啥還要自己去封裝呢?借此文,跟大家簡(jiǎn)單聊一聊。 為什么要重復(fù)造輪子?無(wú)非就一個(gè)原因
以前的輪子有些功能不好用,用起來(lái)不夠優(yōu)雅
Retrofit哪里不好用,用起來(lái)不夠優(yōu)雅?
首先,我覺(jué)得是對(duì)文件的操作不是那么的友好,如文件上傳/下載、上傳/下載進(jìn)度監(jiān)聽(tīng)、斷點(diǎn)下載,這些都需要我們進(jìn)行二次封裝,看過(guò)Android 史上最優(yōu)雅的實(shí)現(xiàn)文件上傳、下載及進(jìn)度的監(jiān)聽(tīng)的同學(xué)知道,使用RxHttp是多么的簡(jiǎn)單;
然后,是對(duì)多個(gè)baseUrl,或者說(shuō)動(dòng)態(tài)baseUrl不夠友好,Retrofit要求baseUrl 必須是一個(gè)final常量,我們想要?jiǎng)討B(tài)修改,就只能通過(guò)增加攔截器去實(shí)現(xiàn),這也是本文重點(diǎn)要說(shuō)的;
最后,也是非常重要的一點(diǎn),那就是Activity/Fragment銷毀時(shí),對(duì)請(qǐng)求的關(guān)閉,通常我們的做法是為請(qǐng)求設(shè)置Tag,然后根據(jù)此Tag去關(guān)閉一系列請(qǐng)求,又或者拿到Call對(duì)象,去關(guān)閉單個(gè)請(qǐng)求,極其的麻煩,如果你使用RxHttp,在Activity/Fragment中,一行代碼就能搞定,并且支持在任意生命周期方法關(guān)閉請(qǐng)求,極其簡(jiǎn)單高效。(注意:Retrofit結(jié)合RxJava,依然能夠在RxJava中斷上下游時(shí),調(diào)用Call對(duì)象的cancel方法,感謝評(píng)論區(qū)卓_修武大佬的指正)
以上就是我重復(fù)造輪子的主要原因,歡迎大家交(Da)流(Lian)討論,下面將進(jìn)入正題。
單個(gè)baseUrl如果你的項(xiàng)目中只有一個(gè)BaseUrl,那么只需要使用@DefaultDomain注解即可,如下:
public class Url {
@DefaultDomain() //設(shè)置為默認(rèn)域名,對(duì)final關(guān)鍵字沒(méi)有要求
public static String baseUrl = "http://ip.taobao.com/";
}
發(fā)送請(qǐng)求,我們就可以這樣
String url = "/service/getIpInfo.php";
RxHttp.get(url) //Get請(qǐng)求
.add("ip", "63.223.108.42") //添加參數(shù)
.addHeader("accept", "*/*") //添加請(qǐng)求頭
.addHeader("connection", "Keep-Alive")
.addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)")
.fromSimpleParser(String.class) //這里返回Observable 對(duì)象
//感知生命周期,并在主線程回調(diào),Activity/fragment銷毀,自動(dòng)關(guān)閉為完成的請(qǐng)求
.as(RxLife.asOnMain(this))
.subscribe(s -> {
//成功回調(diào)
}, throwable -> {
//失敗回調(diào)
});
此時(shí),發(fā)送請(qǐng)求前,RxHttp會(huì)對(duì)我們傳入url做判斷,如果url里已經(jīng)有baseUrl,即是一條完成url鏈接,就不會(huì)添加@DefaultDomain注解表明的baseUrl,否則就會(huì)添加,我們通過(guò)日志來(lái)觀察以下結(jié)果(過(guò)濾RxHttp)
注:注解@DefaultDomain只能使用一處,多處使用將編譯不通過(guò)
多個(gè)baseUrl在上面代碼中,我們只需要傳入一條完整的url鏈接,其實(shí)就已經(jīng)實(shí)現(xiàn)了多個(gè)baseUrl的問(wèn)題,然后,大部分開(kāi)發(fā)者都喜歡將baseUrl 多帶帶寫(xiě)在一個(gè)變量里,如果每次發(fā)請(qǐng)求,我們都需要以baseUrl+url的方式去實(shí)現(xiàn),顯然不夠友好,那么RxHttp又是如果去解決的呢?很簡(jiǎn)單,使用@Domain注解,如下:
public class Url {
@Domain(name = "Update")
public static String update = "http://update.9158.com";
@DefaultDomain() //設(shè)置為默認(rèn)域名,對(duì)final關(guān)鍵字沒(méi)有要求
public static String baseUrl = "http://ip.taobao.com/";
}
此時(shí)rebuild一下項(xiàng)目,RxHttp類就會(huì)自動(dòng)生成一個(gè)setDomainToUpdateIfAbsent()方法,此方法的命名規(guī)則為setDomainTo+@Domain注解中指定的name字段的值+IfAbsent,見(jiàn)名思議,此方法是會(huì)在域名缺席的情況下,添加我們指定的域名,如果沒(méi)有指定,就會(huì)添加@DefaultDomain注解標(biāo)記的默認(rèn)域名。
此時(shí)發(fā)請(qǐng)求,我們就可以這樣:
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("/miaolive/Miaolive.apk")
.setDomainToUpdateIfAbsent() //使用指定的域名
.download(destPath) //注意這里使用DownloadParser解析器,并傳入本地路徑
.as(RxLife.asOnMain(this)) //感知生命周期,并在主線程回調(diào)
.subscribe(s -> {
Log.d("RxHttp", "download success
path=" + s);
//下載成功,回調(diào)文件下載路徑
}, throwable -> {
//下載失敗
});
我們?cè)偻ㄟ^(guò)日志來(lái)觀察一下
可以看到,baseUrl跟url成功拼接在了一起,并完成了下載操作。
@Domain注解可以使用多處,如下:
public class Url {
@Domain(name = "Baidu")
public static String update = "http://www.baidu.com";
@Domain(name = "Hao123")
public static String update = "https://www.hao123.com/";
@Domain(name = "Update")
public static String update = "http://update.9158.com";
@DefaultDomain() //設(shè)置為默認(rèn)域名,對(duì)final關(guān)鍵字沒(méi)有要求
public static String baseUrl = "http://ip.taobao.com/";
}
此時(shí)rebuild一下項(xiàng)目,RxHttp類下就會(huì)再新增setDomainToBaiduIfAbsent()、setDomainToHao123IfAbsent()這兩個(gè)方法,故我們發(fā)請(qǐng)求就可以調(diào)用setDomainToXXXIfAbsent方法指定baseUrl。
動(dòng)態(tài)baseUrl某些情況下,我們的域名可能會(huì)被封,又或者其它原因,導(dǎo)致我們需要在app啟動(dòng)的時(shí)候動(dòng)態(tài)配置域名,如果你使用Retrofit的話,由于Retrofit要求baseUrl必須是final常量,所以我們就只能通過(guò)攔截器去實(shí)現(xiàn),而RxHttp對(duì)baseUrl ,沒(méi)有final關(guān)鍵字的限制,我們只需要對(duì)baseUrl重新賦值即可,而且,可以在代碼中多次賦值,賦值后立即生效。
如:我們將baseUrl里taobao域名改為baidu,改完立即發(fā)送請(qǐng)求。
Url.baseUrl = "http://www.baidu.com"; //更改域名,將taobao域名改為baidu
RxHttp.get("/service/getIpInfo.php") //Get請(qǐng)求
.add("ip", "63.223.108.42") //添加參數(shù)
.addHeader("accept", "*/*") //添加請(qǐng)求頭
.addHeader("connection", "Keep-Alive")
.addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)")
.fromSimpleParser(String.class) //這里返回Observable 對(duì)象
.as(RxLife.asOnMain(this)) //感知生命周期,并在主線程回調(diào)
.subscribe(s -> {
//成功回調(diào)
}, throwable -> {
//失敗回調(diào)
});
看一下日志
小結(jié)
怎么樣,是不是最優(yōu)雅的設(shè)置baseUrl?歡迎打臉。 其實(shí),RxHttp遠(yuǎn)不止本篇文章說(shuō)的這些優(yōu)點(diǎn),更多彩蛋,請(qǐng)查看源碼
本文的目的并不在于說(shuō)Retrofit不好,而是提供一種新的思路與方案,供開(kāi)發(fā)者去選擇。曾經(jīng)有讀者問(wèn)我,有沒(méi)有打算將RxHttp融入Retrofit,Retrofit的注解請(qǐng)求很好用,而且寫(xiě)在一個(gè)類里,很直觀。我的回答是 NO !RxHttp如果融入Retrofit,那RxHttp就是Retrofit,那還有什么區(qū)別呢? 如果你喜歡將請(qǐng)求寫(xiě)在一個(gè)類里,RxHttp也是能實(shí)現(xiàn)的。如下:
public class Http {
public static Observable> getStudents(int id, int page, int size) {
return RxHttp.get("xxx/getStudent")
.add("id", id).add("page", page).add("size", size)
.fromListParser(Student.class);
//后期會(huì)增加add(key,value,key,value....)可變參數(shù)方法
}
//其它請(qǐng)求同理
}
借此機(jī)會(huì),如果你對(duì)RxHttp感興趣,又有自己的想法,歡迎你加入維護(hù)的隊(duì)伍中。
好了,轉(zhuǎn)載請(qǐng)注明出處,
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/7048.html
摘要:?jiǎn)栴}為了防止銷毀時(shí)異步任務(wù)仍然在進(jìn)行所導(dǎo)致的內(nèi)存泄露,我們都會(huì)在方法中去取消異步任務(wù)??偨Y(jié)層可以天然自動(dòng)監(jiān)視銷毀,我一直在找尋如何優(yōu)雅的自動(dòng)取消異步任務(wù),在目前來(lái)看是最佳的方案。協(xié)程絕對(duì)是最先進(jìn)的,效率最高,最優(yōu)雅的技術(shù)棧組合。前提 在Android MVVM模式,我使用了Jetpack包中的ViewModel來(lái)實(shí)現(xiàn)業(yè)務(wù)層,當(dāng)然你也可以使用DataBinding,關(guān)于Android業(yè)務(wù)層架構(gòu)...
摘要:從開(kāi)始,的底層實(shí)現(xiàn)已替換成了,也因此成為了平臺(tái)上主流的網(wǎng)絡(luò)框架之一。,負(fù)責(zé)把接口方法注解轉(zhuǎn)換為表示包括等,負(fù)責(zé)把轉(zhuǎn)換為,并且包裝了的接口調(diào)用。負(fù)責(zé)把轉(zhuǎn)為,使其具備線程調(diào)度能力。其內(nèi)部接口負(fù)責(zé)把請(qǐng)求響應(yīng)結(jié)果轉(zhuǎn)換可識(shí)別的數(shù)據(jù)格式。 Retrofit基本介紹 Retrofit是Square開(kāi)源的一個(gè)適用于Android和Java的類型安全的HTTP網(wǎng)絡(luò)框架。其本質(zhì)是對(duì)OKHttp的進(jìn)一步封裝...
閱讀 845·2023-04-25 19:43
閱讀 4110·2021-11-30 14:52
閱讀 3924·2021-11-30 14:52
閱讀 4026·2021-11-29 11:00
閱讀 3919·2021-11-29 11:00
閱讀 4036·2021-11-29 11:00
閱讀 3752·2021-11-29 11:00
閱讀 6599·2021-11-29 11:00