Retrofit的初次使用

来源:https://www.cnblogs.com/happy-warmth/archive/2019/03/12/10514132.html
-Advertisement-
Play Games

rxretrofitlibrary是一個已經寫好的網路框架庫,先以本地Module導入到自己的項目中。 1、它的初始化操作大多在自定義的application中完成,如: public class App extends Application { @Override public void onC ...


rxretrofitlibrary是一個已經寫好的網路框架庫,先以本地Module導入到自己的項目中。

1、它的初始化操作大多在自定義的application中完成,如:

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化網路框架庫
        RxRetrofitApp.init(this,true);
    }
}
View Code

2、在rxretrofitlibrary下定義一個回調信息統一封裝類(即實際工作中網路請求的返回json實體類),泛型T表示用戶真正關心的數據Data類,例如:

/**
 * 回調信息統一封裝類
 */
public class BaseResultEntity<T> {
    //  判斷標示
    private int ret;
    //    提示信息
    private String msg;
    //顯示數據(用戶需要關心的數據)
    private T data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public int getRet() {
        return ret;
    }

    public void setRet(int ret) {
        this.ret = ret;
    }
}
View Code

3、在項目中使用GsonFormat插件快速創建簡單的Data實體類

public class Data {

    private String downurl;
    private String icoUri;
    private String name;
    private String packageName;

    public String getDownurl() {
        return downurl;
    }

    public void setDownurl(String downurl) {
        this.downurl = downurl;
    }

    public String getIcoUri() {
        return icoUri;
    }

    public void setIcoUri(String icoUri) {
        this.icoUri = icoUri;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    @Override
    public String toString() {
        return "name:"+name+",packageName:"+packageName ;
    }
}
View Code

4、在項目下創建相應的網路請求介面(@GET註解後帶的參數為網路請求url除BaseUrl部分,因為BaseUrl保存在了5中的請求同一封裝類中,便於管理)

public interface HttpGetService {

    @GET("url")
    Observable<BaseResultEntity<Data>> getData();
}
View Code

5、為了使用方便,在rxretrofitlibrary下再定義一個請求統一封裝類BaseApi,此處實現的Func1介面泛型為BaseResultEntity<T>, T。如果在實際項目中,是為了使用RxJava的map操作符將BaseResultEntity<T>轉換為T。(轉換的方法重點在代碼最下麵的call方法中,根據實際的業務邏輯來定)

/**
 * 請求統一封裝
 * @param <T>
 */
public abstract class BaseApi<T> implements Func1<BaseResultEntity<T>, T>{
    //rx生命周期管理
    private SoftReference<RxAppCompatActivity> rxAppCompatActivity;
    /*回調*/
    private SoftReference<HttpOnNextListener> listener;
    /*是否能取消載入框*/
    private boolean cancel;
    /*是否顯示載入框*/
    private boolean showProgress;
    /*是否需要緩存處理*/
    private boolean cache;
    /*基礎url*/
    private String baseUrl = "http://192.168.0.101:8080/";
    /*方法-如果需要緩存必須設置這個參數;不需要不用設置*/
    private String mothed;
    /*超時時間-預設6秒*/
    private int connectionTime = 6;
    /*有網情況下的本地緩存時間預設60秒*/
    private int cookieNetWorkTime = 60;
    /*無網路的情況下本地緩存時間預設30天*/
    private int cookieNoNetWorkTime = 24 * 60 * 60 * 30;
    /* 失敗後retry次數*/
    private int retryCount = 1;
    /*失敗後retry延遲*/
    private long retryDelay = 100;
    /*失敗後retry疊加延遲*/
    private long retryIncreaseDelay = 10;

    public BaseApi(HttpOnNextListener listener, RxAppCompatActivity rxAppCompatActivity) {
        setListener(listener);
        setRxAppCompatActivity(rxAppCompatActivity);
        setShowProgress(false);
        setCache(false);

        setCancel(true);

        setCookieNetWorkTime(60);
        setCookieNoNetWorkTime(24*60*60);
    }

    /**
     * 設置參數
     *
     * @param retrofit
     * @return
     */
    public abstract Observable getObservable(Retrofit retrofit);


    public int getCookieNoNetWorkTime() {
        return cookieNoNetWorkTime;
    }

    public void setCookieNoNetWorkTime(int cookieNoNetWorkTime) {
        this.cookieNoNetWorkTime = cookieNoNetWorkTime;
    }

    public int getCookieNetWorkTime() {
        return cookieNetWorkTime;
    }

    public void setCookieNetWorkTime(int cookieNetWorkTime) {
        this.cookieNetWorkTime = cookieNetWorkTime;
    }

    public String getMothed() {
        return mothed;
    }

    public int getConnectionTime() {
        return connectionTime;
    }

    public void setConnectionTime(int connectionTime) {
        this.connectionTime = connectionTime;
    }

    public void setMothed(String mothed) {
        this.mothed = mothed;
    }

    public String getBaseUrl() {
        return baseUrl;
    }

    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    public String getUrl() {
        return baseUrl + mothed;
    }

    public void setRxAppCompatActivity(RxAppCompatActivity rxAppCompatActivity) {
        this.rxAppCompatActivity = new SoftReference(rxAppCompatActivity);
    }

    public boolean isCache() {
        return cache;
    }

    public void setCache(boolean cache) {
        this.cache = cache;
    }

    public boolean isShowProgress() {
        return showProgress;
    }

    public void setShowProgress(boolean showProgress) {
        this.showProgress = showProgress;
    }

    public boolean isCancel() {
        return cancel;
    }

    public void setCancel(boolean cancel) {
        this.cancel = cancel;
    }

    public SoftReference<HttpOnNextListener> getListener() {
        return listener;
    }

    public void setListener(HttpOnNextListener listener) {
        this.listener = new SoftReference(listener);
    }


    public int getRetryCount() {
        return retryCount;
    }

    public void setRetryCount(int retryCount) {
        this.retryCount = retryCount;
    }

    public long getRetryDelay() {
        return retryDelay;
    }

    public void setRetryDelay(long retryDelay) {
        this.retryDelay = retryDelay;
    }

    public long getRetryIncreaseDelay() {
        return retryIncreaseDelay;
    }

    public void setRetryIncreaseDelay(long retryIncreaseDelay) {
        this.retryIncreaseDelay = retryIncreaseDelay;
    }

    /*
         * 獲取當前rx生命周期
         * @return
         */
    public RxAppCompatActivity getRxAppCompatActivity() {
        return rxAppCompatActivity.get();
    }

    @Override
    public T call(BaseResultEntity<T> httpResult) {
        //map 定義轉換規則
        if (httpResult.getRet() == 0) {//0失敗,1成功
            throw new HttpTimeException(httpResult.getMsg());
        }
        return httpResult.getData();
    }
}
View Code

6、在項目下創建子類DataApi來繼承5中的請求統一封裝類

public class DataApi extends BaseApi<Data> {

    public DataApi(HttpOnNextListener listener, RxAppCompatActivity rxAppCompatActivity) {
        super(listener, rxAppCompatActivity);
        //允許緩存
        setCache(true);
        //緩存的標誌
        setMothed("AppStore/test");
    }

    @Override
    public Observable getObservable(Retrofit retrofit) {
        HttpGetService httpGetService = retrofit.create(HttpGetService.class);
        return httpGetService.getData();
    }
}
View Code

7、最終在繼承自RxAppCompatActivity(因為RxJava需要控制生命周期)的子Activity中調用來得到網路請求數據

DataApi api = new DataApi(new HttpOnNextListener<Data>() {
            @Override
            public void onNext(Data data) {
                Log.i("MainActivity","onNext:"+data.toString()) ;

                Log.i("MainActivity","downurl:"+data.getDownurl());
            }

            @Override
            public void onCacheNext(String string) {
                super.onCacheNext(string);
                Log.i("MainActivity","onCache:"+string);
            }

            @Override
            public void onError(Throwable e) {
                super.onError(e);
            }
        },this);
        HttpManager manager = HttpManager.getInstance();
        //執行網路請求
        manager.doHttpDeal(api);
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過本篇文章我們來學習一下CASE表達式的基本使用方法。 CASE表達式有簡單 CASE表達式(simple case expression)和搜索 CASE表達式(searched caseexpression)兩種寫法,它們分別如下所示。 CASE 表達式的寫法 我們在編寫 SQL 語句的時候需 ...
  • 此篇介紹下psql下dblink的使用方式,幫助自己記錄以備後需。dblink是psql下的擴展功能,可以實現在一個資料庫中遠程操作另外一個資料庫,是實現跨庫的一種方法。下麵步入正文。 安裝dblink 安裝方式自行百度(psql資料庫預設是安裝了的,可先在伺服器上查看),安裝完後$PGHOME下的 ...
  • 我只是搬運工。。。 1.我也下載了,好像不能超過500M每次,100個站。下了也不會看。有沒有高手能介紹下專門下載某個省的所有氣象站氣溫資料的方法,從而計算出每個站每月的平均氣溫。。格式為txt。2 http://www.esrl.noaa.gov/psd/data/gridded/reanalys ...
  • 本文由雲+社區發表 作者:漆洪凱 規則1 :一般情況可以選擇MyISAM存儲引擎,如果需要事務支持必須使用InnoDB存儲引擎。 註意:MyISAM存儲引擎 B tree索引有一個很大的限制:參與一個索引的所有欄位的長度之和不能超過1000位元組。另外MyISAM數據和索引是分開,而InnoDB的數據 ...
  • 存儲過程如同一門程式設計語言,同樣包含了數據類型、流程式控制制、輸入和輸出和它自己的函數庫。 一、基本數據類型:略 二、變數: 自定義變數:DECLARE a INT ; SET a=100; 可用以下語句代替:DECLARE a INT DEFAULT 100; 變數分為用戶變數和系統變數,系統變數又 ...
  • 測試是軟體開發中的基礎,它經常被數據開發者忽視,但是它很重要。在本文中會展示如何使用Python的uniittest.mock庫,對一段PySpark代碼進行測試。筆者會從數據科學家的視角來進行工作,這意味著本文將不會深入某些軟體開發的細節。 本文鏈接:https://www.cnblogs.com ...
  • mysql 5.7或以上的新版本sql_mode 預設開啟開 ONLY_FULL_GROUP_BY,如果 select 中出現的欄位,沒有使用聚合函數,或不存在group by中就會提示,this is incompatible with sql_mode=only_full_group_by。 解 ...
  • InnoDB鎖的基本概念 文章總共分為五個部分: "InnoDB的鎖機制淺析(一)—基本概念/相容矩陣" "InnoDB的鎖機制淺析(二)—探索InnoDB中的鎖(Record鎖/Gap鎖/Next key鎖/插入意向鎖)" "InnoDB的鎖機制淺析(三)—幻讀" "InnoDB的鎖機制淺析(四) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...