国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android OkHttp 史上最優雅的設置baseUrl

番茄西紅柿 / 1679人閱讀
前言

RxHttp截止本文發表已經推廣了4個禮拜,目前已經有了141個star,如下:

其中一文,Android 史上最優雅的實現文件上傳、下載及進度的監聽更是得到了大神劉皇叔微信公眾號的推送,歡迎讀者關注劉皇叔微信公眾號「劉望舒」,每天都有精彩的文章推送,真的很棒。

本文將在RxHttp的基礎上帶大家如何優雅的設置BaseUrl,如果您還未了解RxHttp,請移步

RxHttp 一條鏈發送請求,新一代Http請求神器(一)

RxHttp 一條鏈發送請求之強大的數據解析功能(二)

RxHttp 一條鏈發送請求之強大的Param類(三)

RxHttp 一條鏈發送請求之注解處理器 Generated API(四)

為何要重復造輪子

RxHttp一經推出,就有人問:難道Retrofit不好用嗎?為啥還要自己去封裝呢?借此文,跟大家簡單聊一聊。 為什么要重復造輪子?無非就一個原因

以前的輪子有些功能不好用,用起來不夠優雅

Retrofit哪里不好用,用起來不夠優雅?

首先,我覺得是對文件的操作不是那么的友好,如文件上傳/下載、上傳/下載進度監聽、斷點下載,這些都需要我們進行二次封裝,看過Android 史上最優雅的實現文件上傳、下載及進度的監聽的同學知道,使用RxHttp是多么的簡單;

然后,是對多個baseUrl,或者說動態baseUrl不夠友好,Retrofit要求baseUrl 必須是一個final常量,我們想要動態修改,就只能通過增加攔截器去實現,這也是本文重點要說的;

最后,也是非常重要的一點,那就是Activity/Fragment銷毀時,對請求的關閉,通常我們的做法是為請求設置Tag,然后根據此Tag去關閉一系列請求,又或者拿到Call對象,去關閉單個請求,極其的麻煩,如果你使用RxHttp,在Activity/Fragment中,一行代碼就能搞定,并且支持在任意生命周期方法關閉請求,極其簡單高效。(注意:Retrofit結合RxJava,依然能夠在RxJava中斷上下游時,調用Call對象的cancel方法,感謝評論區卓_修武大佬的指正)

以上就是我重復造輪子的主要原因,歡迎大家交(Da)流(Lian)討論,下面將進入正題。

單個baseUrl

如果你的項目中只有一個BaseUrl,那么只需要使用@DefaultDomain注解即可,如下:

public class Url {
    @DefaultDomain() //設置為默認域名,對final關鍵字沒有要求
    public static String baseUrl = "http://ip.taobao.com/";
}

發送請求,我們就可以這樣

  String url = "/service/getIpInfo.php";
  RxHttp.get(url) //Get請求
        .add("ip", "63.223.108.42") //添加參數
        .addHeader("accept", "*/*") //添加請求頭
        .addHeader("connection", "Keep-Alive")
        .addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)")
        .fromSimpleParser(String.class)  //這里返回Observable 對象
        //感知生命周期,并在主線程回調,Activity/fragment銷毀,自動關閉為完成的請求
        .as(RxLife.asOnMain(this))
        .subscribe(s -> {
            //成功回調
        }, throwable -> {
            //失敗回調
        });

此時,發送請求前,RxHttp會對我們傳入url做判斷,如果url里已經有baseUrl,即是一條完成url鏈接,就不會添加@DefaultDomain注解表明的baseUrl,否則就會添加,我們通過日志來觀察以下結果(過濾RxHttp)

可以看到,baseUrl跟url成功拼接在了一起,并完成了請求。

注:注解@DefaultDomain只能使用一處,多處使用將編譯不通過

多個baseUrl

在上面代碼中,我們只需要傳入一條完整的url鏈接,其實就已經實現了多個baseUrl的問題,然后,大部分開發者都喜歡將baseUrl 多帶帶寫在一個變量里,如果每次發請求,我們都需要以baseUrl+url的方式去實現,顯然不夠友好,那么RxHttp又是如果去解決的呢?很簡單,使用@Domain注解,如下:

public class Url {
    @Domain(name = "Update")
    public static String update = "http://update.9158.com";

    @DefaultDomain() //設置為默認域名,對final關鍵字沒有要求
    public static String baseUrl = "http://ip.taobao.com/";
}

此時rebuild一下項目,RxHttp類就會自動生成一個setDomainToUpdateIfAbsent()方法,此方法的命名規則為setDomainTo+@Domain注解中指定的name字段的值+IfAbsent,見名思議,此方法是會在域名缺席的情況下,添加我們指定的域名,如果沒有指定,就會添加@DefaultDomain注解標記的默認域名。

此時發請求,我們就可以這樣:

  String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
  RxHttp.get("/miaolive/Miaolive.apk")
        .setDomainToUpdateIfAbsent() //使用指定的域名
        .download(destPath) //注意這里使用DownloadParser解析器,并傳入本地路徑
        .as(RxLife.asOnMain(this))  //感知生命周期,并在主線程回調
        .subscribe(s -> {
            Log.d("RxHttp", "download success 
path=" + s);
            //下載成功,回調文件下載路徑
        }, throwable -> {
            //下載失敗
        });

我們再通過日志來觀察一下

可以看到,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() //設置為默認域名,對final關鍵字沒有要求
    public static String baseUrl = "http://ip.taobao.com/";
}

此時rebuild一下項目,RxHttp類下就會再新增setDomainToBaiduIfAbsent()setDomainToHao123IfAbsent()這兩個方法,故我們發請求就可以調用setDomainToXXXIfAbsent方法指定baseUrl。

動態baseUrl

某些情況下,我們的域名可能會被封,又或者其它原因,導致我們需要在app啟動的時候動態配置域名,如果你使用Retrofit的話,由于Retrofit要求baseUrl必須是final常量,所以我們就只能通過攔截器去實現,而RxHttp對baseUrl ,沒有final關鍵字的限制,我們只需要對baseUrl重新賦值即可,而且,可以在代碼中多次賦值,賦值后立即生效。

如:我們將baseUrl里taobao域名改為baidu,改完立即發送請求。

  Url.baseUrl = "http://www.baidu.com";  //更改域名,將taobao域名改為baidu
  RxHttp.get("/service/getIpInfo.php") //Get請求
        .add("ip", "63.223.108.42") //添加參數
        .addHeader("accept", "*/*") //添加請求頭
        .addHeader("connection", "Keep-Alive")
        .addHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)")
        .fromSimpleParser(String.class)  //這里返回Observable 對象
        .as(RxLife.asOnMain(this))  //感知生命周期,并在主線程回調
        .subscribe(s -> {
            //成功回調
        }, throwable -> {
            //失敗回調
        });

看一下日志

可以看到,域名成功被更改,并立即生效。由于該接口不存在,所以返回了Html頁面代碼。

小結

怎么樣,是不是最優雅的設置baseUrl?歡迎打臉。 其實,RxHttp遠不止本篇文章說的這些優點,更多彩蛋,請查看源碼

本文的目的并不在于說Retrofit不好,而是提供一種新的思路與方案,供開發者去選擇。曾經有讀者問我,有沒有打算將RxHttp融入Retrofit,Retrofit的注解請求很好用,而且寫在一個類里,很直觀。我的回答是 NO !RxHttp如果融入Retrofit,那RxHttp就是Retrofit,那還有什么區別呢? 如果你喜歡將請求寫在一個類里,RxHttp也是能實現的。如下:

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);
        //后期會增加add(key,value,key,value....)可變參數方法
    }
    
    //其它請求同理
}

借此機會,如果你對RxHttp感興趣,又有自己的想法,歡迎你加入維護的隊伍中。

好了,轉載請注明出處,

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7048.html

相關文章

  • 上最優雅在VM層取消Coroutine方式

    摘要:問題為了防止銷毀時異步任務仍然在進行所導致的內存泄露,我們都會在方法中去取消異步任務。總結層可以天然自動監視銷毀,我一直在找尋如何優雅的自動取消異步任務,在目前來看是最佳的方案。協程絕對是最先進的,效率最高,最優雅的技術棧組合。前提 在Android MVVM模式,我使用了Jetpack包中的ViewModel來實現業務層,當然你也可以使用DataBinding,關于Android業務層架構...

    cuieney 評論0 收藏0
  • RTFSC系列之Retrofit

    摘要:從開始,的底層實現已替換成了,也因此成為了平臺上主流的網絡框架之一。,負責把接口方法注解轉換為表示包括等,負責把轉換為,并且包裝了的接口調用。負責把轉為,使其具備線程調度能力。其內部接口負責把請求響應結果轉換可識別的數據格式。 Retrofit基本介紹 Retrofit是Square開源的一個適用于Android和Java的類型安全的HTTP網絡框架。其本質是對OKHttp的進一步封裝...

    lpjustdoit 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<